ios中json解析出现的null问题

网络虫      2022-02-13     241

关键词:

http://my.oschina.net/iq19900204/blog/408034

在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。

问题现象

但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现了原因:由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据:

1
"somevalue":null

通过JsonKit 这个第三方库解析出来的数据就成了

1
somevalue = "<null>";

这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:

1
 -[NSNull length]: unrecognized selector sent to instance 0x388a4a70

解决方法

其实一直没有找到完美的解决办法,坑了我很久。

1、最开始的解决方法就是为了应付当前遇到的崩溃,看看哪个字段可能为空,那么就对该字段使用前进行判断,通过崩溃时的错误提示可以看出,这样的字段解析成的对象是 NSNull 类型的,所以可以直接判断是不是此类型:

1
 if (![isKindOfClass:[NSNull class]]){xxxxxxx;}

因为字段实在太多,就找一个补一个。

2、后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null ,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json时,返回结果时string对象,于是就先替换 null 为 为空字符””,然后再解析。

1
json = [jsonStr  stringByReplacingOccurrencesOfString:@":null" withString:@":"""];

这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json无法解析了。

3、最后没有办法,只能在解析的时候下手,把是NSNull 类型的值替换成nil。 一般就写个tool方法,然后解析时调用。但是嫌太麻烦,就想弄写个宏,通过搜索惊奇的发现宏也是可以有返回值的,结果如下:

1
2
3
4
5
6
7
8
#define VerifyValue(value)
({id tmp;
if ([value isKindOfClass:[NSNull class]])
tmp = nil;
else
tmp = value;
tmp;
})

宏里的最后一句语句便是返回值。然后在解析数据时调用宏:

1
contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);

4、如果你使用AFNetwork 这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值

1
self.removesKeysWithNullValues = YES;

5、终极方案
终于找到了一劳永逸的方案,牛逼的老外写了一个Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github上查看;
https://github.com/nicklockwood/NullSafe

ios解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userdefault的问题

解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault。打印下得到的字典数据:“username”=<null>此时如果将字典保存到userDefault中会报错所以需要遍历字典将其替换for... 查看详情

ios在json解析过程中浮点型字符串出现精度丢失问题

参考技术A在解析的时候遇到了当有两位小数字符串时,会出现小数点后面突然多出了很多位小数.比如后台返回数据为9.88,解析过后却变成了9.880000000000001或者9.799999999999999,这是因为浮点型字符串在解析过程中出现精度丢失.对解析... 查看详情

Json 解析问题 iOS:缺少“

】Json解析问题iOS:缺少“【英文标题】:JsonParsingissueiOS:missing"【发布时间】:2011-09-0517:51:37【问题描述】:尝试在xcode中解析json数据时遇到了一个大问题。我实际上尝试过使用两种不同的解析器,但它仍然返回错误的json。... 查看详情

在 iOS 中解析 JSON(再次)

】在iOS中解析JSON(再次)【英文标题】:ParsingJSON(again)iniOS【发布时间】:2011-03-2004:00:54【问题描述】:我只是在iOS中使用JSON解析器,它作为一个(简单的)示例运行良好。但我想知道如何真正解析(有点)更复杂的东西,Twitt... 查看详情

在 IOS 中解析 Twitter JSON 提要

】在IOS中解析TwitterJSON提要【英文标题】:ParsingTwitterJSONfeedinIOS【发布时间】:2011-03-1311:49:24【问题描述】:我只是在iOS中使用JSON解析器,它作为一个(简单)示例运行良好。但我想知道如何真正解析(有点)更复杂的东西,Twi... 查看详情

Xcode 解析 JSON 返回 NULL

】Xcode解析JSON返回NULL【英文标题】:XcodeParsingJSONReturnsNULL【发布时间】:2016-02-1010:40:41【问题描述】:我在解析一些JSON数据时遇到问题,其中包含嵌套数组中的嵌套数组。我尝试解析的单个JSON对象如下所示:"date":1454284800,"exerc... 查看详情

ios开发过程中,遇到解析的json数据为<null>,进行赋值时会导致崩溃,使用afnetworking可以这样解决。

((AFJSONResponseSerializer*)manager.responseSerializer).removesKeysWithNullValues=YES;  查看详情

JSON 解析返回 null 到 iOS(json 字符串看起来正确)

】JSON解析返回null到iOS(json字符串看起来正确)【英文标题】:JSONparsingreturnsnulltoiOS(jsonstringlookscorrect)【发布时间】:2011-08-2119:14:31【问题描述】:我正在尝试获取一个JSON到iOS应用程序,但不断获取NULL值..-(id)initWithDictionary:(NSDi... 查看详情

在 Flutter 中解析 JSON 会导致对象字段的 NULL 值

】在Flutter中解析JSON会导致对象字段的NULL值【英文标题】:ParsingJSONinFlutterresultsinNULLvaluesofobjects\'sfields【发布时间】:2020-02-0707:13:42【问题描述】:我有一个JSON文件,结构如下:["key1":"value1","key2":"value2","key3":"value3","key4":"value4",... 查看详情

在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值

】在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值【英文标题】:howtogetarealnullvalueinsteadofaJSONObject.NULLvaluewhenparsingJSONingrails【发布时间】:2011-12-1305:33:11【问题描述】:我正在尝试使用grails.converters.JSON库在Grails中解... 查看详情

如何在颤振中解析这个复杂的json

】如何在颤振中解析这个复杂的json【英文标题】:howtoparsethiscomplexjsoninflutter【发布时间】:2021-08-1805:54:06【问题描述】:帮我解析一下这个复杂的json数据..!!!我收到这样的错误类型“_InternalLinkedHashMap”不是类型“Iterable”的子... 查看详情

iOS:JSON 解析为 NSArray?

】iOS:JSON解析为NSArray?【英文标题】:iOS:JSONparsingtoNSArray?【发布时间】:2014-08-2812:35:08【问题描述】:您好,我收到以下JSON作为响应,但在尝试将其解析为NSArray时出现错误。NSArray*resp=[JSONobjectForKey@"CONVCOLL"];它对上面的行抛出... 查看详情

Flutter 使用合理的 null 安全性将多级 JSON 解析为类

】Flutter使用合理的null安全性将多级JSON解析为类【英文标题】:FlutterparsingmultilevelJSONtoaclassusingsoundnullsafety【发布时间】:2021-08-0111:43:27【问题描述】:我在AndroidStudio中使用FLutter,将多级JSON解析为一个类。尽管我检查了许多***... 查看详情

Swift3 - UIImageView 没有从解析的 JSON 数据中出现

】Swift3-UIImageView没有从解析的JSON数据中出现【英文标题】:Swift3-UIImageViewisn\'tappearingfromparsedJSONdata【发布时间】:2017-06-2702:27:47【问题描述】:大家好,我的第一个问题很想得到帮助。我花了很长时间浏览论坛,但仍在努力理... 查看详情

使用改造将 json 解析为 POJO

】使用改造将json解析为POJO【英文标题】:parsingjsontoPOJOusingretrofit【发布时间】:2016-06-2005:56:21【问题描述】:我正在尝试,但不断出现错误。它似乎得到了数据,据我从logcat中看到的,我正确读取并解析了json。但它返回succes=fa... 查看详情

在 iOS 中解析 JSON [重复]

】在iOS中解析JSON[重复]【英文标题】:ParsingJSONiniOS[duplicate]【发布时间】:2011-08-0919:47:58【问题描述】:可能重复:UsingJSONiniOS如何在iOS中解析JSON响应?我找到了这个tutorial,并遵循了它,但不了解执行此操作的确切方法。所以... 查看详情

在 Swift 问题中为 iOS 应用程序解析 JSON

】在Swift问题中为iOS应用程序解析JSON【英文标题】:ParsingJSONforiOSappinSwiftIssue【发布时间】:2016-03-2519:59:10【问题描述】:首先,这是一个菜鸟问题,所以任何有兴趣的人都可以回答我,因为我只是一个初学者。因此,我需要从... 查看详情

Javascript - 去掉 JSON 字符串中出现的 u',解析返回意外令牌

】Javascript-去掉JSON字符串中出现的u\\\',解析返回意外令牌【英文标题】:Javascript-stripoutoccurrencesofu\'inJSONstring,parseisreturningunexpectedtokenJavascript-去掉JSON字符串中出现的u\',解析返回意外令牌【发布时间】:2014-02-1415:19:05【问题描... 查看详情