2017-02-24 100 views
1

我的JSON是這樣的:形式POJO解析JSON

{ 
    "bid": "181.57", 
    "ask": "181.58", 
    "volume": { 
     "item1": "543.21", 
     "item2": "123.45", 
     "timestamp": 1487903100000 
    }, 
    "last": "181.58" 
} 

我試圖用彈簧restTemplate讀取到一個POJO。我現在的POJO是這樣的: -

import com.fasterxml.jackson.annotation.JsonProperty; 

public class DataModel { 
    private String last; 

    private Volume volume; 

    private String ask; 

    private String bid; 

    // Getter and setters 
} 

class Volume 
{ 
    private String timestamp; 

    @JsonProperty 
    private String item1; 

    @JsonProperty 
    private String item2; 

    // Gettersand setters 
} 

的問題是,「物品1」和「ITEM2」的int JSON可改爲「ITEM5」和「ITEM6」,這取決於實體我查詢。如果我的變量名爲item1和item2,我會得到空值。我如何保留變量item1和item2的通用名稱,並仍然能夠正確讀取通用變量中的值?有沒有任何註釋可以幫助到這裏?

+0

你不能添加item5和item6到Volume類,並且會一直返回? –

回答

2

我相信這是你在找什麼從Baeldung tutorial

3.3。 @JsonAnySetter

@JsonAnySetter允許您使用Map作爲標準屬性的靈活性。在反序列化時,來自JSON的屬性將被簡單地添加到地圖中。

讓我們來看看它是如何工作 - 我們將使用@JsonAnySetter反序列化實體ExtendableBean:

public class ExtendableBean { 
    public String name; 
    private Map<String, String> properties; 

    @JsonAnySetter 
    public void add(String key, String value) { 
     properties.put(key, value); 
    } 
} 

這是我們需要反序列化JSON:

{ 
    "name":"My bean", 
    "attr2":"val2", 
    "attr1":"val1" 
} 

下面是這一切是如何綁在一起:

@Test 
public void whenDeserializingUsingJsonAnySetter_thenCorrect() 
    throws IOException { 
    String json 
     = "{\"name\":\"My bean\",\"attr2\":\"val2\",\"attr1\":\"val1\"}"; 

    ExtendableBean bean = new ObjectMapper() 
     .readerFor(ExtendableBean.class) 
     .readValue(json); 

    assertEquals("My bean", bean.name); 
    assertEquals("val2", bean.getProperties().get("attr2")); 
} 

就你而言,你只需查詢地圖字符串值您希望爲您正在進行的任何查詢。