簡體   English   中英

Jackson 將對象反序列化為列表

[英]Jackson deserialize object to list

這是示例json。

{
    "foo1" : "...",
    "foo2" : "...",
    "foo3" : "...",
    "foo4" : "..."
}

我想像這樣反序列化它。

class Response {
    List<Foo> foos;
}

我試過這個,但沒有奏效。

class Response {
    ...
    
    @JsonProperty("foo\\d")
    private void collect(String bar) {
        foos.add(bar);
    }
}

這奏效了。 但我想要更簡單的事情。

@JsonProperty("foo1")
private void collect1(String bar) {
    foos.add(bar);
}

@JsonProperty("foo2")
private void collect2(String bar) {
    foos.add(bar);
}
    .
    .
    .

您應該嘗試@JsonAnySetter注釋。

例子:

public class Test {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        String json = "{\n" +
            "  \"foo1\" : \"...\",\n" +
            "  \"foo2\" : \"...\",\n" +
            "  \"foo3\" : \"...\",\n" +
            "  \"foo4\" : \"...\"\n" +
            "}";
        Test test = objectMapper.readValue(json, Test.class);
    }

    @JsonAnySetter
    void setInformation(String key, Object value) {
        System.out.println(key + " " + value);
    }
}

main()方法調用的輸出是:

foo1 ...
foo2 ...
foo3 ...
foo4 ...

如何將對象轉換為地圖,然后將地圖轉換為列表

//This is some object
class Fruit{
    private String name;
    private int price;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
       this.price = price;
    } 

    @Override
    public String toString() {
        return name+","+price;
    }


}

class Response{
    List<Fruit> fruits;

    public Response() {
        fruits = new ArrayList<Fruit>();
    }
}

class Util{
    public static Map<String, Object> jsonToMap(String jsonStr) {
        Map<String, Object> map = null;
    
        ObjectMapper mapper = new ObjectMapper();
    
        try {
            map = mapper.readValue(jsonStr, new TypeReference<Map<String, 
Object>>(){});
        } catch (JsonProcessingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return map;
    }

}

public class Deserialize {

    public static void main(String[] args) {
        //1. Call jsonStr
        String jsonStr = "{\r\n"
                 + "    \"fruit1\": {\r\n"
                + "     \"name\": \"melon\",\r\n"
                + "     \"price\": \"500\"\r\n"
                + " },\r\n"
                + " \"fruit2\": {\r\n"
                + "     \"name\": \"banana\",\r\n"
                + "     \"price\": \"1000\"\r\n"
                + " }\r\n"
                + "}";
        //2. deserialize it to Map
        Map<String, Object> map = Util.jsonToMap(jsonStr);
    
        //System.out.println(map);
        //{fruit1={name=melon, price=500}, fruit2={name=banana, price=1000}}
    
        //3. add to fruit to fruits list of class Response 
        Response response = new Response();
    
        map.forEach((k,v) ->{
            //   If json has key of fruit
            if(k.contains("fruit")) {
                final ObjectMapper mapper = new ObjectMapper(); // jackson's 
objectmapper
                final Fruit fruit = mapper.convertValue(v, Fruit.class);
            
                response.fruits.add(fruit);
            }
        });
    
        //melon,500
        //banana,1000
        response.fruits.stream().forEach(v -> System.out.println(v.toString()));
    

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM