2016-10-10 2 views
1

Пожалуйста, помогите! Я пытаюсь создать объект из JSON с модулем jackson kotlin. Вот источник json:Объекты поколения Kotlin Jackson от JSON

{ 
    "name": "row", 
    "type": "layout", 
    "subviews": [{ 
     "type": "horizontal", 
     "subviews": [{ 
      "type": "image", 
      "icon": "ic_no_photo", 
      "styles": { 
       "view": { 
        "gravity": "center" 
       } 
      } 
     }, { 
      "type": "vertical", 
      "subviews": [{ 
       "type": "text", 
       "fields": { 
        "text": "Some text 1" 
       } 
      }, { 
       "type": "text", 
       "fields": { 
        "text": "Some text 2" 
       } 
      }] 
     }, { 
      "type": "vertical", 
      "subviews": [{ 
       "type": "text", 
       "fields": { 
        "text": "Some text 3" 
       } 
      }, { 
       "type": "text", 
       "fields": { 
        "text": "Some text 4" 
       } 
      }] 
     }, { 
      "type": "vertical", 
      "subviews": [{ 
       "type": "image", 
       "icon": "ic_no_photo" 
      }, { 
       "type": "text", 
       "fields": { 
        "text": "Some text 5" 
       } 
      }] 
     }] 
    }] 
} 

Я пытаюсь создать экземпляр класса скелета.

data class Skeleton (val type : String, 
         val name: String, 
         val icon: String, 
         val fields: List<Field>, 
         val styles: Map<String, Map<String, Any>>, 
         val subviews : List<Skeleton>) 

data class Field (val type: String, val value: Any) 

Как вы можете видеть, объект Skeleton может иметь другие Skeleton объекты внутри (и эти объекты могут иметь другие объекты Skeleton внутри тоже), а также скелет может иметь Список Field объекты

val mapper = jacksonObjectMapper() 
val skeleton: Skeleton = mapper.readValue(File(file)) 

Этот код заканчивается исключением:

com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class com.uibuilder.controllers.parser.Skeleton] value failed (java.lang.IllegalArgumentException): Parameter specified as non-null is null: method com.uibuilder.controllers.parser.Skeleton.<init>, parameter name 
at [Source: docs\layout.txt; line: 14, column: 3] (through reference chain: com.uibuilder.controllers.parser.Skeleton["subviews"]->java.util.ArrayList[0]->com.uibuilder.controllers.parser.Skeleton["subviews"]->java.util.ArrayList[0]) 

ответ

4

Есть несколько вопросов, которые я нашел о своем отображении, предотвращающих Джексона от чтения значения из JSON:

  • Skeleton класс не имеет нулевых параметров конструктора (например, val type: String, а не String?), а Джексон передает null им, если в JSON отсутствует значение для этих параметров. Это то, что вызывает исключение, вы упомянули:

    Параметр определяется как не-нуль равно нулю: метод com.uibuilder.controllers.parser.Skeleton.<init>, параметр name

    Чтобы избежать этого, следует отметить те параметры, которые, возможно, могли иметь значения отсутствуют в Nullable (все параметры в вашем случае):

    data class Skeleton(val type: String?, 
            val name: String?, 
            val icon: String?, 
            val fields: List<Field>?, 
            val styles: Map<String, Map<String, Any>>?, 
            val subviews : List<Skeleton>?) 
    
  • fields в Skeleton имеет тип List<Field>, но в формате JSON он представлен одним объектом, а не массивом. Исправление будет изменить тип fields параметра в Field?:

    data class Skeleton(... 
            val fields: Field?, 
            ...) 
    
  • Кроме того, Field класс в коде не соответствует объектов в формате JSON:

    "fields": { 
        "text": "Some text 1" 
    } 
    

    Вы должны изменить Field класс как ну, так что он имеет text свойство:

    data class Field(val text: String) 
    

После того, как я внес изменения, которые я перечислил, Джексон мог успешно прочитать рассматриваемый JSON.


Смотрите также:"Null Safety" in Kotlin reference.

+0

Спасибо большое! Ты помог мне!) –

Смежные вопросы