Разбор нескольких уровней JSON в классы - PullRequest
0 голосов
/ 29 августа 2018

У меня есть комплексный набор данных 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 на каждом уровне глубины?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...