jackson kotlin - 无法从START_OBJECT标记中反序列化`java.util.ArrayList`的实例

时间:2018-05-22 19:44:53

标签: java json kotlin jackson2

我从Fitbit API获取json字符串。我想在List对象中保存dateTime和value字段。我正在使用杰克森模块kotlin。我为此创建了ActivitiesSteps数据类。

我不知道如何避免“活动步骤”字段而且我被卡住了。

这是JSON主体(在我的代码中以变量'jsonSteps'提供给readValue方法):

$('#dialog_confirm').bind('dialogclose', function(event, ui) {
        if($(event.target).text() != 'Cancel') {
            console.log("Clicked Confirm");
            $.ajax({
                url: "check-domain-remove.php",
                type: "post",
                dataType: 'json',
                data: $('#remove_domain_form').serialize(),
                success: function (response) {
                    if (response === "Success") {
                        //DO OTHER STUFF
                        var success_div = '<p class=\"input--success\">Domain Successfully Removed</p><br><br>';
                        $('body').append(success_div);
                    }
                }

            });
        }
    });

这是我保存数据的课程:

  {  
   "activities-steps":[  
      {  
         "dateTime":"2018-04-17",
         "value":"11045"
      },
      {  
         "dateTime":"2018-04-18",
         "value":"14324"
      },
      {  
         "dateTime":"2018-05-16",
         "value":"11596"
      }
   ]
}

这是我使用jackson的代码:

data class ActivitiesSteps(var dateTime: String, var value: String)

抛出以下异常:

val mapper = jacksonObjectMapper()
val stepsList = mapper.readValue<List<ActivitiesSteps>>(jsonSteps)

2 个答案:

答案 0 :(得分:2)

您需要拥有一个与JSON顶级匹配的外部对象。在这种情况下,请将代码更改为:

data class ActivityConfig(
    @JsonProperty("activities-steps") val steps: List<ActivitiesSteps> = emptyList()
)

data class ActivitiesSteps(var dateTime: String, var value: String)

val stepsList = mapper.readValue<ActivityConfig>(jsonSteps).steps

如果您希望列表始终存在,您可以使用Jackson Kotin模块的默认值,如果需要,您也不需要数据类中的var成员,val正常工作除非你真的想改变这些价值观,否则杰克逊也会如此。

答案 1 :(得分:0)

问题在于,你试图得到的数组被包裹在一个对象中,你正在向杰克逊提供并要求返回List。 JSON object-to-Java List不是Jackson理解的翻译,所以它很窒息。

我会创建一个包装List并尝试反序列化的类。