如何检查 json 对象是不是包含 <null>?

Posted

技术标签:

【中文标题】如何检查 json 对象是不是包含 <null>?【英文标题】:How to check if json object contains <null>?如何检查 json 对象是否包含 <null>? 【发布时间】:2015-11-25 07:56:39 【问题描述】:

我通过在我的应用程序中发出网络请求从服务器获取 Json。我正在为 Json 对象中的某些键获取 &lt;null&gt; 值。我的应用程序获取如果收到这种类型的响应会崩溃。请告诉我如何验证>?

我已经尝试过了,但它并不总是有效。

 if(!(user_post.username==(id)[NSNull null]) )


        user_post.username=[dict_user_info objectForKey:@"name"];
         if(user_post.username!=nil)
            

               ser_post.username=[dict_user_info objectForKey:@"name"];

             
        else
              

                user_post.username=@"Username";

              


【问题讨论】:

检查if ([user_post.username length]&gt;=1) 使用isEqualif([user_post.username isEqual:[NSNull null]])isKindOfClass 也应该可以工作.. 在第一行中,我认为您的意思是测试[dict_user_info objectForKey:@"name"] 以查看它是否为[NSNull null] 【参考方案1】:

考虑测试 null 的值,这样您的程序就不会崩溃。像这样:

if([dict_user_info objectForKey:@"name"] != [NSNull null])

    ser_post.username=[dict_user_info objectForKey:@"name"];

【讨论】:

您需要解释为什么您的代码示例优于其他示例。到目前为止,由于缺乏解释,您的答案已被自动标记为低质量。【参考方案2】:

创建NSDictionaryCategory 并在其中添加以下方法,将字典中每个键的空值替换为空字符串。

- (NSDictionary *)dictionaryByReplacingNullsWithStrings 

    const NSMutableDictionary *replaced = [self mutableCopy];
    const id nul = [NSNull null];
    const NSString *blank = @"";

    for(NSString *key in self) 
        const id object = [self objectForKey:key];
        if(object == nul || object == NULL) 
            //pointer comparison is way faster than -isKindOfClass:
            //since [NSNull null] is a singleton, they'll all point to the same
            //location in memory.
            [replaced setObject:blank
                         forKey:key];
        
    

    return [replaced copy];

用法: [yourJSONDictionary dictionaryByReplacingNullsWithStrings];

详细了解 ios 中的类别 Tutorial 1 和 Tutorial 2

【讨论】:

【参考方案3】:
yourJsonObject = [myDic valueforkey@"key"];
if(yourJsonObject != [NSNull null])

 //not null

** you can also check whether object exist or not 
if(yourJsonObject)

//exist

【讨论】:

【参考方案4】:

我认为你混淆了你的逻辑。我试图忠实于您的代码,但如果以下内容不是您想要的,请告诉我:

if (dict_user_info[@"name"] != nil && [dict_user_info[@"name"] isKindOfClass:[NSNull class]] == NO) 
    user_post.username = dict_user_info[@"name"];

    if (user_post.username != nil) 
        ser_post.username = user_post.username;
     else 
        user_post.username = @"Username";
    

【讨论】:

【参考方案5】:

这是我为我的项目编写的几个方法,试试吧:

/*!
 *  @brief  Makes sure the object is not NSNull or NSCFNumber, if YES, converts them to NSString
 *  @discussion Sometimes JSON responses can contain NSNull objects, which does not play well with Obj-C. So when you access a value from a JSON and expect it to be an NSString, pass it through this method just to make sure thats the case.
 *  @param str The object that is supposed to be a string
 *  @return The object cleaned of unacceptable values
 */
+ (NSString *)cleanedJsonString:(id)str

  NSString *formattedstr;
  formattedstr = (str == [NSNull null]) ? @"" : str;
  if ([str isKindOfClass:[NSNumber class]]) 
    NSNumber *num = (NSNumber*) str;
    formattedstr = [NSString stringWithFormat:@"%@",num];
  
  return formattedstr;

/*!
 *  @brief  Makes Sure the object is not NSNull
 *  @param obj Sometimes JSON responses can contain NSNull objects, which does not play well with Obj-C. So when you access a value from a JSON ( NSArray, NSDictionary or NSString), pass it through this method just to make sure thats the case.
 *  @return The object cleaned of unacceptable values
 */
+ (id)cleanedObject:(id)obj

  return (obj == [NSNull null]) ? nil : obj;

/*!
 *  @brief A JSON cleaning function for NSArray Objects.
 *  @discussion Sometimes JSON responses can contain NSNull objects, which does not play well with Obj-C. So when you access a value from a JSON and expect it to be an NSArray, pass it through this method just to make sure thats the case. This method first checks if the object itself is NSNull. If not, then it traverses the array objects and cleans them too.
 *  @param arr The Objects thats supposed to be an NSArray
 *  @return The NSNull Cleaned object
 */
+ (NSArray *)cleanedJsonArray:(id)arr

  if (arr == [NSNull null]) 
    return [[NSArray alloc] init];
  
  else
  
    NSMutableArray *arrM = [(NSArray*)arr mutableCopy];
    int i=0;
    for (id __strong orb in arrM)
    
        if (orb == [NSNull null])
        
            [arrM removeObjectAtIndex:i];;
        
        i++;
    
    return arrM;
  

只需将JSON 字符串、数组或对象传递给适当的方法,该方法就会为您清理它。

【讨论】:

【参考方案6】:

帮自己一个忙,编写一个方法来处理这个问题并将其放入扩展中。喜欢

- (NSString*)jsonStringForKey:(NSString*)key

    id result = self [key];
    if (result == nil || result == [NSNull null]) return nil;
    if ([result isKindOfClass:[NSString class]]) return result; 

    NSLog (@"Key %@: Expected string, got %@", key, result);
    return nil;

您甚至可以添加一些接受 NSNumber* 结果并将它们转换为字符串的代码,如果这是您的服务器返回的内容(这里的一些发帖人遇到的问题是,他的服务器返回的衣服尺寸为 40 之类的数字或“40-”之类的字符串42" 这使得这样的东西很有用)。

然后你的代码就变成了可读的一行

user_post.username = [dict_user_info jsonStringForKey:@"name"] ?: @"username";

我实际上使用了几种略有不同的方法,具体取决于我是否期望 null、不期望值、期望空字符串,当我的假设错误时会向我发出警告(但总是返回不会破坏的东西)。

【讨论】:

【参考方案7】:

试试这个:

if(!(user_post.username == (NSString *)[NSNull null]) )

【讨论】:

铸造[NSNull null] 既错误又无用。它什么也没做。 为什么! == 而不是好旧的 != ? @Avi:需要一些强制转换,因为编译器不允许您比较 NSString* 和 NSNull*。我会转换为 id (以避免 [NSNull null] 可能是 NSString 的印象)。 编译器会生成一个警告,但它当然允许。我同意投射到id 更好。 NSNull *而不是NSString *,这将照顾编译器抱怨something == [NSNull null] @Avi 在我的构建中,如果编译器发出警告它不允许它:-)(严格的零警告政策)。

以上是关于如何检查 json 对象是不是包含 <null>?的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素

使用Javascript检查JSON对象是不是包含值[重复]

检查 Json 数组是不是包含逻辑应用程序中的对象

如何检查 json 是不是包含 JavaScript 中的值?

如何检查 MySQL JSON 列是不是包含 laravel 中的值?

如何检查传入的 JSON 提要是不是包含单条记录或多条记录?