Можно ли читать подобъект JSON напрямую как объект JSON DOM или данные или какой-либо другой обобщенный формат c? - PullRequest
1 голос
/ 17 января 2020

Есть ли 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 как данные или что-то подобное. Так возможно ли это?

...