Есть ли JSON DOM, который может читать любой JSON, независимо от типа, и сохранять его во что-то вроде иерархии словаря?
Рассмотрим это JSON и код ...
var jsonData = """
{
"type":"ListWrapper",
"objectData": {
"label":"SuperItems",
"items":[
{
"value":"First"
},
{
"value":"Second"
},
{
"value":"Third"
},
{
"value":"Fourth"
}
]
}
}
""".data(using:.utf8)!
Вот первая часть того, что мы пытаемся сделать. (Примечание: на самом деле это не работает.)
class TestObject : Codable {
var name:String?
var childObject:Data? // <-- This is the 'wishful' part
}
do{
let testObject = try JSONDecoder().decode(TestObject.self, from:jsonData)
processTestObject(testObject)
}
catch let error {
print(error.localizedDescription)
}
Теперь где-то в приложении мы определили это (обратите внимание, что это соответствует объекту, хранящемуся в 'objectData' выше), и мы пытаемся сделать это ...
class ListWrapper : Codable {
var label:String?
var items:[ListItem]?
}
class ListItem : Codable {
var value:String?
}
do{
switch testObject.type{
case "ListWrapper":
var listWrapper = try JSONDecoder().decode(ListWrapper.self, from:testObject.objectData)
processList(listWrapper)
case "Foo":
var listWrapper = try JSONDecoder().decode(Foo.self, from:testObject.objectData)
processFoo(foo)
}
}
catch let error {
print(error.localizedDescription)
}
Примечание: Да, мы знаем, что можем закодировать JSON в objectData и сохранить его как строку, но мы пытаемся оставить JSON как есть.
Один из подходов состоит в том, чтобы написать собственный десериализатор для TestObject
, но мы должны сообщить ему все возможные типы, которые мы ищем. Мы можем сделать это, но я надеялся сделать его «тупым» объектом, который просто хранит JSON как данные или что-то подобное. Так возможно ли это?