У меня есть комплексный набор данных JSON , который я хочу поместить в Objective-C классы , но я не могу этого сделать.
Проект уже выполнен на Android с использованием библиотеки Gson , которая позволяет зарегистрировать классы один раз и весь JSON анализируется, создавая один объект верхнего уровня, заполненный всеми классами подуровня .
Вот пример набора данных :
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}}]}";
После некоторых поисков я обнаружил, что нет никакого истинного эквивалента в target-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 или я вынужден выполнять пользовательские циклы setValue: forKey: based for-if на каждом уровне глубины?