TouchJSON是否可以返回可变对象?

4

我从网络服务那里收到了一些JSON数据。我使用TouchJSON库对其进行解析。

我保存这个数据以便用户更改某些值,然后想将其返回给网络服务。

我得到的JSON对象包含在对象内部的NSDictionary对象,就像这样:

[
    {
        "id": null,
        "created_at": 12332343,
        "object": {
            "name": "Some name",
            "age" : 30 
        },
        "scope": "it stuff",
        "kind_id": 1,
        "valid": true,
        "refering_statement": {
            "id": 95 
        },
        "user": {
            "id": 1 
        } 
    }
]

如果我想改变这个字典中的值,我无法这样做,因为TouchJSON返回的对象是不可变的。

有没有办法让TouchJSON返回可变对象?

或者有没有办法让Objective C生成一个可变的NSDictionary及其所有子项?

还是说我必须遍历每个NSDictionary,并将所有数据复制到可变副本中,然后重新插入所有内容?

希望有人能帮我解决这个问题:) 先谢谢了。


将对象强制转换为NSMutableDictionary类型,无法实现吗? - petershine
2
@Peter Casting是一个编译时的结构,它不会改变对象的实际类型。 - Jonathan Sterling
2个回答

2

TouchJson有一个选项,可以返回可变对象而不是普通对象。(我通过查看源代码找到了它)。默认情况下,它返回的是"copy"而不是"mutablecopy"。

NSError *error = nil;    
jsonString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
CJSONDeserializer *jsondeserializer = [CJSONDeserializer deserializer];
jsondeserializer.scanner.options = kJSONScannerOptions_MutableContainers;
NSMutableDictionary *jsonitems = [[NSMutableDictionary alloc] initWithDictionary:[jsondeserializer deserializeAsDictionary:jsonData error:&error]];

对我没用,这行代码出错了:jsondeserializer.scanner.options = kJSONScannerOptions_MutableContainers; - Ivan
Minime,谢谢你的帮助!我真的应该也看一下源代码。 - Caspar Harmer

0
你可以像这样从一个字典创建一个可变字典。
(假设你的 JSON 解析后的字典被命名为 jsonDictionary)
NSMutableDictionary *userDictionary = [NSMutableDictionary dictionaryWithDictionary:jsonDictionary];

希望这能解决你的问题。

嗨Peter和NWCoder。当解析完成后,我将我的整个NSDictionary转换为可变的。问题是,整个字典内部的'user'和'object'字典仍然是不可变的:(目前,我遍历我的每个json字典,使外部字典可变,通过键提取内部字典,制作一个可变副本,删除旧字典并重新插入新的可变字典-这是可怕的工作流程,特别是当对象在服务器端更改时。强制转换、可变副本或快速初始化器似乎只对外部字典起作用,这也是可以理解的。 - RickiG

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