猿问

反序列化嵌套的 Json 数组

我有一些 Json 看起来像:


{

  "foo": [

    {

      "bar": "baz"

    }

  ],

  "foo2": [

    {

      "bar": "baz"

    }

  ],

  "dishes": [

    {

      "name": "tonno",

      "details": {

        "toppings": [

          "cheese",

          "tomato",

          "tuna"

        ],

        "price": 10

      }

    },

    {

      "name": "cheese",

      "details": {

        "toppings": [

          "cheese",

          "tomato"

        ],

        "price": 5

      }

    },

    {

      "name": "mexicana",

      "details": {

        "toppings": [

          "cheese",

          "tomato",

          "chicken"

        ],

        "price": 12,

        "inOffer": true

      }

    }

  ]

}

我对“foo”和“foo2”不感兴趣,只想反序列化“菜肴”。为此,我创建了两个类:


public class Dish {


    @JsonProperty("name")

    private String name;


    @JsonProperty("details")

    private List<Detail> details;

}


public class Detail {


    @JsonProperty("toppings")

    private List<String> toppings;


    @JsonProperty("price")

    private int price;


    @JsonProperty("inOffer")

    private boolean inOffer;

}

我找到了这种方法并尝试了以下方法:


ObjectMapper mapper = new ObjectMapper();

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

final JsonNode response = mapper.readTree(json).path("dishes");

final CollectionType collectionType = TypeFactory.defaultInstance().constructCollectionType(List.class, Dish.class);

List<Dish> dishes = mapper.readerFor(collectionType).readValue(response);

但是,如果我运行它,我会得到


m.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token  at [Source: UNKNOWN; line: -1, column: -1]

如何使用嵌套数组反序列化嵌套 Json 而不必映射我不感兴趣的字段?


四季花海
浏览 146回答 2
2回答

SMILET

您应该映射details为 POJO 而不是List<Details>public class Dish {@JsonProperty("name")private String name;@JsonProperty("details")private Detail details;}

撒科打诨

你可以试试这个:JavaType&nbsp;javaType&nbsp;=&nbsp;mapper.getTypeFactory().constructParametricType(List.class,&nbsp;Dish.class); List<Dish>&nbsp;dishes&nbsp;=&nbsp;mapper.readValue("jsonString",&nbsp;javaType);
随时随地看视频慕课网APP

相关分类

Java
我要回答