TouchJSON, dealing with NSNull

前端 未结 3 1357
清酒与你
清酒与你 2020-11-29 06:50

Hi I am using TouchJSON to deserialize some JSON. I have been using it in the past and on those occasions I dealt with occurrences of NSNull manually. I would think the auth

相关标签:
3条回答
  • 2020-11-29 07:14

    For another JSON library, but with the same issues, I've created the following category on NSDictionary:

    @implementation NSDictionary (Utility)
    
    // in case of [NSNull null] values a nil is returned ...
    - (id)objectForKeyNotNull:(id)key {
       id object = [self objectForKey:key];
       if (object == [NSNull null])
          return nil;
    
       return object;
    }
    
    @end
    

    Whenever I deal with JSON data from said library, I retrieve values like this:

    NSString *someString = [jsonDictionary objectForKeyNotNull:@"SomeString"];
    

    This way the code in my projects become a lot cleaner and at the same time I don't have to think about dealing with [NSNull null] values and the like.

    0 讨论(0)
  • 2020-11-29 07:15

    nil and NULL are actually both equal to zero, so they are, in practice, interchangeable. But you're right, for consistency, the documentation for TouchJSON should have used theDeserializer.nullObject = nil instead of NULL.

    Now, when you do that, your second predicate actually works fine:

    if (![jsonDataDict objectForKey:someKey])
    

    because TouchJSON omits the key from the dictionary when you have nullObject set to nil (or NULL). When the key doesn't exist in the dictionary, NSDictionary returns nil, which is zero so your if condition works as you expect.

    If you don't specify nullObject as nil, you can instead check for null like so:

    if ([jsonDataDict objectForKey:someKey] == [NSNull null])
    
    0 讨论(0)
  • 2020-11-29 07:29

    There are libraries which deal with it. One of them is SwiftyJSON in Swift, another one is NSTEasyJSON in Objective-C. With this library (NSTEasyJSON) it will be easy to deal with such problems. In your case you can just check values you need:

    NSTEasyJSON *JSON = [NSTEasyJSON withData:JSONData];
    NSString *someValue = JSON[someKey].string;
    

    This value will be NSString or nil and you should not check it for NSNull, NULL yourself.

    0 讨论(0)
提交回复
热议问题