Objective-C中的Gson等价物

18

在Objective-C中有没有类似于gson的东西?

谢谢。

8个回答

14

最好的是它也可以转换嵌套对象。太棒了。 - Alberto M

6

5
在Objective-C中,GSON的功能有点内置。假设我定义了一个类,如下所示:
 @interface MyModel : NSObject
 @property(nonatomic,strong) NSString *name;
 @property(nonatomic,strong) NSString *address;
 @end

假设我有一个如下定义的JSON对象:

{
    "name":"marc",
    "address":"1234 Some Street"
}

然后我可以使用AFNetworking获取JSON对象的NSDictionary,这非常容易。最后你可以像下面这样做循环,其中dict是由AFNetworking解析JSON返回的字典,self是MyModel类的实例。
for (NSString *key in dict) {
   [self setObject:dict[key] forKey:key];
}

在Java中,GSON使用反射技术来实现与上述循环相同的效果。但是,在Objective-C中,这个过程要容易得多,因此不需要使用库来完成。如果您有嵌套对象,则可以使用AFNetworking和DCKeyValueObjectMapping。


在Android中,GSON使用反射,但反射在Android中速度较慢。尽管如此,我们仍然使用GSON进行反序列化。我想知道在iOS中,使用AFNetworking进行映射是否会减慢速度? - j2emanue

4
OCMapper非常类似于Gson且易于使用。 https://github.com/aryaxt/OCMapper Json
{
   "firstName"   : "FirstName",
   "lastName"    : "LastName",
   "age"         : 26,
   "dateOfBirth" : "01/01/2013",
   "address"     : { 
                        "city" : "San Diego", 
                        "country" : "US"  
                   },
   "posts"       : [
                         {
                             "title" : "Post 1 title",
                             "datePosted : "04/15/2013",
                         },
                         {
                             "title" : "Post 2 title",
                             "datePosted : "04/12/2013",
                         }
                   ]
}

模型

@objc public class User: NSObject {

    var firstName: String?
    var lastName: String?
    var age: NSNumber?
    var dateOfBirth: NSDate?
    var address: Address?
    var posts: [Post]?
}

使用 Swift

let user = ObjectMapper.sharedInstance().objectFromSource(dict, toInstanceOfClass:User.self) as User

or

let User = User.objectFromDictionary(dictionary)

使用Objective-C

User *user = [[ObjectMapper sharedInstance] objectFromSource:dictionary toInstanceOfClass:User.class];

or

User *user = [User objectFromDictionary:dictionary];

0
在2017年的WWDC上,苹果公司推出了Swift Codable协议,使得解析JSON变得更加轻松无痛。
struct YourStructure: Codable {
    let name: String?
    let avatarUrl: URL?
    private enum CodingKeys: String, CodingKey {
        case name
        case avatarUrl = "avatar_url"
    }
}

解码器:

let decoder = JSONDecoder()
parsedData = decoder.decode(YourStructure.self, from: YourJsonData)

编码:

let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(data)

更多信息:编码和解码自定义类型


0

OCMapper 是我知道的最好、最容易使用的库,它还具有反向映射功能,并且可以映射复杂对象而无需配置,同时也能与 realmObjects 兼容。


-2

我认为我已经找到了几个可以实现这个目的的库,但最重要的一个似乎是RestKit


6
我们在一个项目中使用了RestKit库,但我不会再使用它了。它非常慢,还导致了很多奇怪的错误。 - Marc
4
使用RestKit就像是在挖自己的坟墓。 - aryaxt
@Marc比其他人更好地使用了Mantle吗?我是iOS的新手,对任何库都没有什么概念。 - Chintan Rathod
@ChintanRathod 使用 AFNetworking。在 Objective-C 中不需要映射库,因为您可以在类属性上使用 [setObject:forKey:]。因此,自己编写是微不足道的。 - Marc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接