将对象序列化为 JSON

Posted

技术标签:

【中文标题】将对象序列化为 JSON【英文标题】:Serializing an object to JSON 【发布时间】:2013-01-14 19:46:50 【问题描述】:

我是 JSON 格式的新手,但它看起来非常适合我正在尝试的内容。我需要使用自定义 NSObject(食谱)并通过电子邮件中的 URL 字符串发送。然后收件人将在我的应用程序中打开链接并解析 URL。

我现有的实现从配方的详细信息手动构建一个字符串,并在另一端对其进行解码。我更喜欢使用更标准的东西,比如 JSON。

到目前为止,我已将以下方法添加到我的 Recipe 类中:

- (NSData *)jsonRepresentation

    NSDictionary *dictionary = @@"name":self.name,
                         @"instructions":self.instructions;
    NSError* error;
    return [NSJSONSerialization dataWithJSONObject:dictionary
                                           options:NSJSONWritingPrettyPrinted
                                             error:&error];

我可以使用以下方法成功记录 NSData 对象:

 [[NSString alloc]initWithData:recipe.jsonRepresentation
                      encoding:NSUTF8StringEncoding];

但是,我还不能添加我的成分列表(NSArray)。我试图简单地使用它:

NSDictionary *dictionary = @ @"name" : self.name,
                      @"instructions" : self.instructions,
                       @"ingredients" : self.orderedIngredients ;

但在登录时,我收到此错误:

Invalid type in JSON write (Ingredient)

如你所知,我在这方面还很陌生。

在将ingredients 数组添加到字典之前,我是否打算对它做一些事情?

【问题讨论】:

注意:我没有使用任何第三方框架,并且暂时不想使用,直到我知道自己在做什么。 什么是成分对象?在添加到当前字典之前,您应该在该类中编写一个方法以返回一个 NSDictionary 左右。 成分是具有一些属性的自定义对象。我在这里唯一关心的是名字。 如果名字就是你想要的,请检查我的答案。 【参考方案1】:

试试这个:

NSDictionary *dictionary = @ @"name" : self.name,
                      @"instructions" : self.instructions,
                       @"ingredients" : [self.orderedIngredients valueForKey:@"name"] ;

假设self.orderedIngredients 是一个包含ingredients 对象的数组,并且ingredients 有一个名为name 的属性,

[self.orderedIngredients valueForKey:@"name"]

将返回一个包含所有名称的数组。

【讨论】:

谢谢。非常简洁。我只希望 XCode 可以让它看起来一样漂亮。【参考方案2】:

如果您的成分列表包含自定义类对象,您应该为该类创建一个序列化程序。

【讨论】:

好的 - 我不清楚我会怎么做,但我看到了区别。我可以改用一组成分名称吗? @user1111278,+1。如果我们必须将 ingredients 的所有属性转换为 JSON,我同意 serializer 部分。

以上是关于将对象序列化为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将 PHP 对象图序列化/反序列化为 JSON

使用 Json.net 将 JSON 对象反序列化为动态对象

将JSON对象反序列化为嵌套的C#对象

将 JSON 反序列化为匿名对象

将 Objective-C 对象序列化和反序列化为 JSON

如何将属性序列化为 json 对象?