0

我正在寻找执行 JSON 到 Objective-C 关系对象映射的库或框架。即,我需要将包含对象、对象数组和对象字典的 JSON 映射到我的自定义对象。

就像是:

DataObject {
    "user" : {
        "name":"Peter",
        "id":1234
    }
    "place": "UK"
    "job": {
        "title" : "CTO",
        "salary" : 1234567
    }
    "employess": [
        {
            "name":"Carlton",
            "id":1235
        },
        {
            "name":"Hugo",
            "id":12346
        }]
}

所以有一个 DataObject 一个 UserObject 和一个由 UserObjects 组成的员工数组。我希望从 JSON 到我的 DataObject 的映射“自动”发生,这当然意味着我想描述 Object 类中的对象和关系并由此完成映射,而不是手动映射每个嵌套目的。(使用 setValue:forKey 和其他 KVO 方法可以轻松完成第一级原生 Objective-c 属性,但从那里开始变得复杂)。

我一直在测试 RestKit,但似乎没有办法从该框架中挑选出你需要的功能,要么全部要么全部不,而且我确实发现它对我的需求来说太多了。

有没有人熟悉可以做到这一点的图书馆等?

先感谢您。

4

2 回答 2

2

为了将 JSON 映射到 Objective-C 对象,我尝试了 RestKit。我之前使用过它,所以我的批评可能不再适用。
我发现:好主意。插件不太复杂。如果它有效,那对你来说很好。但如果不是,或者如果您需要进一步推动它,那么祝您调试好运。
我后悔投资它的时间。

我只是在寻找 JSON 到 Objective-C 对象,而不是相反。我在 SO 上找到了指向JTObjectMapping的链接- 但找不到原始答案。似乎更轻巧,更接近我正在搜索的内容,但我没有机会尝试它。

另一个类似的类:jastor

我更喜欢这两个类的方法而不是 RestKit,因为它只处理一项工作,而 RestKit 试图处理所有事情。

于 2012-11-13T09:42:53.677 回答
0

您在上面发布的内容不是有效的 JSON。如果您将其设置为有效的 JSON,那么如果没有特定的模式,您想要做的事情是不可能的,例如。

{
    "DataObject": {
        "user": {
            "name": "Peter",
            "id": 1234
        },
        "place": "UK",
        "job": {
            "title": "CTO",
            "salary": 1234567
        }
    }
}

Dataobject 是字典还是对象?用户或工作呢?什么是 User 是 NSUser 的实例,而 job 是 NSDictionary?

另一方面,如果你有一个已知的模式: -

[
    {
        "class": "DataObject",
        "properties": {
            "user": {
                "class": "User",
                "properties": {
                    "name": "Peter",
                    "id": 1234
                }
            },
            "place": "UK",
            "job": {
                "title": "CTO",
                "salary": 1234567
            }
        }
    }
]

您不需要框架,因为一旦您拥有有效的 JSON,就可以自己映射到您的对象是微不足道的。伪代码:-

createWithDict(dict) {
    var newOb = create new(dict["class"]);
    dict.properties.each( val, key ) {
        if(val is dictionary && val.hasproperty("class"))
            val = createWithDict(val)
        newOb[key] = val
    }   
    return newOb;
} 
于 2011-05-30T08:48:12.077 回答