当前位置: 首页 > 面试题库 >

iOS JSON序列化用于基于NSObject的类

欧阳何平
2023-03-14
问题内容

我想对自己的自定义类进行JSON序列化。我正在使用Objective-C / iOS5。我想要执行以下操作:

Person* person = [self getPerson ]; // Any custom object, NOT based on NSDictionary
NSString* jsonRepresentation = [JsonWriter stringWithObject:person ];
Person* clone = [JsonReader objectFromJson: jsonRepresentation withClass:[Person Class]];

看来NSJSONSerialization(和其他几个库)要求’person’类基于NSDictionary等。我想要一些可以序列化我想要定义的自定义对象的对象(在合理范围内)。

假设Person.h看起来像这样:

#import <Foundation/Foundation.h>
@interface Person : NSObject 
@property NSString* firstname;
@property NSString* surname;
@end

我希望为实例生成的JSON与以下内容相似:

{"firstname":"Jenson","surname":"Button"}

我的应用程序使用ARC。我需要可以使用对象进行序列化和反序列化的东西。

非常感谢。


问题答案:

这是一个棘手的问题,因为可以放入JSON的唯一数据是简单的对象(请考虑NSString,NSArray,NSNumber…),而不是自定义类或标量类型。为什么?如果不构建各种条件语句来将所有这些数据类型包装到这些对象类型中,则解决方案将是这样的:

//at the top…
#import <objC/runtime.h>

    NSMutableDictionary *muteDictionary = [NSMutableDictionary dictionary];

    id YourClass = objc_getClass("YOURCLASSNAME");
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList(YourClass, &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        SEL propertySelector = NSSelectorFromString(propertyName);
        if ([classInstance respondsToSelector:propertySelector]) {
            [muteDictionary setValue:[classInstance performSelector:propertySelector] forKey:propertyName];
        }
    }
    NSError *jsonError = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:muteDictionary options:0 error:&jsonError];

尽管由于我之前所说,这很棘手。如果您有任何标量类型或自定义对象,那么整个过程就会崩溃。如果真的需要进行这样的事情,我建议您花些时间并查看Ricard的链接,这些链接使您可以查看有助于将值包装到NSDictionary安全对象中的条件语句的属性类型。



 类似资料:
  • 我有这样一个通用类: T可以包含、或。String和intger之间的区别似乎工作正常,很可能是因为这些类型在序列化的JSON文件中表示不同。然而,当我在JSON对象中有一个日期时间时(参见示例),它无论如何都会被解析为字符串。 字段的实际使用类型是由输入决定的。虽然我在下面的最小示例中确实有这方面的知识,但这并不适用于我程序中该代码的所有使用。我只能依赖字段的值模式。 我还没有成功修补。如果该字

  • 问题内容: 有人知道如何基于NSObject类序列化嵌套JSON吗?有序列化JSON简单的讨论在这里,但它不是一般的足够,以满足复杂的嵌套JSON。 想象这是JSON的结果: 从这个班级: 如何基于类对它们进行序列化/反序列化? 编辑 目前,我可以基于任何类生成这样的有效负载: 但是它不能满足嵌套的复杂JSON的要求。有人对此有更好的解决方案吗?该 C#库可根据对象类进行序列化/反序列化。我想基于

  • 我正在使用JacksonPolymorphicDeserialization,这是我的代码,它反序列化到基于“type”属性的适当类中: 它工作得很好,我的json根据“type”值变成了预期的类。 但是,我正在考虑将“type”属性从String移动到Enum,这是我的新代码,带有以下更改: 和枚举: 问题是,第二种方法不起作用。。。知道为什么吗???我可以在这里使用Enum吗??? 谢谢!

  • 我和杰克逊有一个问题,我认为这个问题应该很容易解决,但它正在折磨我。 假设我有一个java POJO类,看起来像这样(假设我有getter和setter): 我想反序列化看起来像这样的JSON到一个User对象: Jackson给了我一些问题,因为User不是JSON中的第一级对象。我显然可以创建一个UserWrapper类,它有一个用户对象,然后使用它反序列化,但我知道一定有一个更优雅的解决方案

  • 问题内容: 我只是想知道我如何序列化foo是我自己的制造类。 我是否需要做任何特别的事情,即首先定义自己的xml结构,然后对列表中的每个值调用toString并将其写出? 谁能给我指出一个好的教程?http://java.sun.com/products/jfc/tsc/articles/persistence4/多数民众赞成在我一直在看,但似乎没有提到如何处理非库类。 谢谢 问题答案: 如果您正

  • 问题内容: 可以说我有这样的表: 我想得到的是这样的表: 发生的第一件事是基于column进行排序。 发生的第二件事是基于列的,但仅基于列中具有相同数字的行 在不使用任何数据库引擎的情况下应该如何解决此问题? 问题答案: 通常,通常使用where 是包含所有三个值的类型(例如,“ foo”,第一行的5、0)来执行此操作。 然后,您将编写一个比较在中呈现给它的两个对象的Int1值的,如果给出了明确的