2015-05-04 111 views
4

我試圖將Jsonpath的輸出直接映射到POJO列表。 我使用傑克遜作爲地圖提供者。將Jsonpath輸出映射到POJO列表

Jsonpath輸出

{ 
    "actions" : [ 
    { 
     "parameterDefinitions" : [ 
     { 
      "defaultParameterValue" : { 
      "name" : "PARAM1", 
      "value" : "" 
      }, 
      "description" : "Type String", 
      "name" : "PARAM1", 
      "type" : "StringParameterDefinition" 
     }, 
     { 
      "defaultParameterValue" : { 
      "name" : "PARAM3", 
      "value" : "" 
      }, 
      "description" : "Type String", 
      "name" : "PARAM3", 
      "type" : "StringParameterDefinition" 
     } 
     ] 
    } 
    ] 
} 

JobParameter.java(該POJO其中我想映射):

public class JobParameter { 

    private String description; 
    private String name; 
    private String type; 

    // public getters & setters 

Jsonpath初始化

Configuration conf = Configuration 
    .builder() 
    .mappingProvider(new JacksonMappingProvider()) 
    .build(); 

List<JobParameter> jobParameters = JsonPath 
    .using(conf) 
    .parse(jsonpathOutput) 
    .read("$.actions[0].parameterDefinitions[0:]", List.class); 

使用上面的代碼,我總是得到一個地圖。見一個toString()這張地圖上的結果如下:

[{defaultParameterValue={name=PARAM1, value=}, description=Type String, name=PARAM1, type=StringParameterDefinition}, {defaultParameterValue={name=PARAM3, value=}, description=Type String, name=PARAM3, type=StringParameterDefinition}] 

需要注意的是,當我嘗試映射Jsonpath輸出到單個對象,反序列化工作正常:

Configuration conf = Configuration 
    .builder() 
    .mappingProvider(new JacksonMappingProvider()) 
    .build(); 

JobParameter singleJobParameter = JsonPath 
    .using(conf) 
    .parse(jsonpathOutput) 
    .read("$.actions[0].parameterDefinitions[0]", JobParameter .class); 

在這個例子中在上面,singleJobParameter實例已被很好地創建和填充。

我錯過了什麼嗎? 謝謝!

回答

0

使用包裝POJO解決了這個問題。

@JsonIgnoreProperties(ignoreUnknown = true) 
public class JobParametersWrapper { 

    private List<JobParameter> parameterDefinitions; 

    public List<JobParameter> getParameterDefinitions() { 
     return parameterDefinitions; 
    } 

    public void setParameterDefinitions(List<JobParameter> parameterDefinitions) { 
     this.parameterDefinitions = parameterDefinitions; 
    } 
} 
0
<dependency> 
    <groupId>com.github.jsurfer</groupId> 
    <artifactId>jsurfer-simple</artifactId> 
    <version>1.2.2</version> 
</dependency> 

隨着JsonSurfer,您可以通過簡單的兩行實現這一點:

JsonSurfer jsonSurfer = JsonSurfer.jackson(); 
Collection<JobParameter> parameters = jsonSurfer.collectAll(json, JobParameter.class, "$.actions[0].parameterDefinitions[*]"); 

而且不要忘記忽略未使用 「defaultParameterValue」 在你的POJO。

@JsonIgnoreProperties({"defaultParameterValue"}) 
private static class JobParameter { 

    private String description; 
    private String name; 
    private String type; 
+0

非常有趣,但不回答問題:-) – tduchateau

5

必須使用TypeRef這一點。在你的情況下,你還必須使用@JsonIgnoreProperties註解。

Configuration conf = Configuration 
      .builder() 
      .mappingProvider(new JacksonMappingProvider()) 
      .jsonProvider(new JacksonJsonProvider()) 
      .build(); 


    TypeRef<List<JobParameter>> type = new TypeRef<List<JobParameter>>(){}; 

    List<JobParameter> jobParameters = JsonPath 
      .using(conf) 
      .parse(json) 
      .read("$.actions[0].parameterDefinitions[0:]", type); 

請注意,這並不是所有JsonMappingProviders都支持的。