2017-02-24 99 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")); 
} 

就你而言,你只需查询地图字符串值您希望为您正在进行的任何查询。