将多个级别的JSON解析为类

时间:2018-08-29 17:11:47

标签: ios objective-c

我有一个复杂的JSON数据集,我想放入 Objective-C类中,但我无法做到这一点。

该项目已经使用 Gson 库在Android上完成,该库允许一次注册这些类,并且解析整个JSON,从而创建一个填充了所有子类的顶级对象< / strong>。

这是样本数据集

jsonString = @"{\"$type\":\"CSL.Model.ModelClass+ModelDocument, Assembly-CSharp\",\"elements\":[{\"$type\":\"CSL.Model.RoomElement, Assembly-CSharp\",\"elements_ref\":[{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":2,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":8,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":16,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":26,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":40,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":58,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":95,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":143,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":199,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":263,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":335,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":409,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":497,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":593,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":691,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":802,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":929,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1057,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1196,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1340,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1499,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1669,\"file_id\":null},{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1854,\"file_id\":null}],\"name\":\"Room_00\",\"uid\":{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":1,\"file_id\":null}},{\"$type\":\"CSL.Model.DirectionElement, Assembly-CSharp\",\"direction\":{\"x\":0.0,\"y\":1.0,\"z\":0.0},\"uid\":{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":4,\"file_id\":null}},{\"$type\":\"CSL.Model.NormalPointElement, Assembly-CSharp\",\"normal_ref\":{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":4,\"file_id\":null},\"position\":{\"x\":0.512084961,\"y\":-1.298706,\"z\":1.2651509},\"uid\":{\"$type\":\"CSL.Model.UID, Assembly-CSharp\",\"id\":5,\"file_id\":null}}]}";

经过一番搜索,我发现在Objective-C / Swift中没有真正等同于Android Gson的系统,最好的结果是 DCKeyValueObjectMapping ,或者没有使用KVC / setValue:forKey:的库。 >

在顶层,我设法定义了 DCParserConfiguration ,并为可能的顶层元素(RoomElement,DirectionElement,NormalPointElement)定义了映射器

例如

DCArrayMapping *roomElementMapper = [DCArrayMapping mapperForClassElements:[RoomElement class] forAttribute:@"elements" onClass:[ModelDocument class]];
[config *addArrayMapper*:roomElementMapper];

我的顶级类ModelDocument和其“元素” NSArray *一起被填充,但未在下面填充。 addArrayMapper:看起来可以在顶层运行。

我可以为JSON文件的每个深度级别定义映射器,还是必须在每个深度级别执行基于set-if的自定义set-if循环?

0 个答案:

没有答案