【问题标题】:JSON serialisation of NSOrderedSet within iOSiOS 中 NSOrderedSet 的 JSON 序列化
【发布时间】:2012-05-08 09:08:21
【问题描述】:

将 NSOrderedSets 序列化和反序列化为 JSON 有哪些选择?我正在使用 iOS5/Objective-C。我想我可以自己推出,但我假设那里有一些很好的现有框架......

【问题讨论】:

  • 那么是否有特定的原因不想将 Set 转换为 Array 优先序列化?
  • @Alladinian - 我有一个包含大量嵌套集/数组的模型。这是我需要序列化的模型。对整个模型使用 NSJSONSerialization 会很棒,但我需要遍历整个模型,将所有出现的 NSOrderedSet 转换为 NSArray。我正在寻找一个序列化类,我可以将整个模型传递给它,它可以处理 NSOrderedSets 而无需以这种方式预处理模型。
  • 这是有道理的。我们在谈论NSManagedObjects 吗?

标签: objective-c ios json nsorderedset


【解决方案1】:

由于 JSON 没有 set 数据类型,并且它的 Array 是有序的,因此您可以先转换为 NSArray 然后序列化,如下所示:

NSOrderedSet *os = [NSOrderedSet orderedSetWithObjects:@"1", @"2", @"3", nil];
NSArray *jsonArr = [os array];
// JSON Data
NSData *json = [NSJSONSerialization dataWithJSONObject:jsonArr options:0 error:nil];
// JSON String representation
NSString *jsonString = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];

【讨论】:

    【解决方案2】:

    您唯一的选择可能是访问开源库并查看 JSON 序列化程序是如何实现的代码。然后,您可以根据您的目的扩展库。我所说的“扩展”是指您应该尽可能多地利用现有库,因为从头开始制作自己的序列化器可能需要大量工作。

    通常,JSON 库定义 JSON 类型和对应的 Objective-C 类型(类)之间的映射。例如,一个 JSON Array 映射到一个 NSArray/NSMutableArray,一个 JSON Object 映射到一个 NSDictionary/NSMutableDictionary 等等。

    “JSON 序列化器”因此会“知道”如何将“映射”的 Objective-C 对象序列化为 JSON 元素。实现此行为的一种方法是将 Category 添加到映射的 Objective-C 类。

    因此,当“扩展库”(取决于库和实现)时,只需为您的自定义类添加一个类别并相应地实现它就足够了。

    我是 JSON 库的作者。为自定义类创建类别,然后可以在 JSON 序列化器中使用这些类别并不费力。您可以在增强请求中指定您的需求,因此我可以调整库以更轻松地添加自定义类。

    您的类别如下所示:

    @interface NSOrderedSet (JPJsonWriter) <JPJsonWriterInserterProtocol>
    @end
    
    @implementation NSOrderedSet (JPJsonWriter)
    
    - (int) JPJsonWriter_insertIntoBuffer:(NSMutableDataPushbackBuffer*)buffer 
                                 encoding:(JPUnicodeEncoding)encoding
                                  options:(JPJsonWriterOptions)options
                                    level:(NSUInteger)level
    {
        return insertJsonArray(self, buffer, encoding, options, level);
    }
    
    @end
    

    这实际上是您必须做的所有事情 - 在对我的库进行了一些调整之后。但请注意:这取决于您使用的 JSON 库。您可以在 here 上找到我的 JSON 库。请提交增强请求 - 谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2013-02-04
      • 2016-01-25
      • 2014-03-23
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多