【问题标题】:Map a Jsonpath output to a list of POJOs将 Jsonpath 输出映射到 POJO 列表
【发布时间】:2015-05-04 09:23:10
【问题描述】:

我正在尝试将 Jsonpath 的输出直接映射到 POJO 列表。 我使用 Jackson 作为映射提供者。

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 实例已很好地创建和填充。

我错过了什么吗? 谢谢!

【问题讨论】:

    标签: java jackson jsonpath


    【解决方案1】:

    您必须为此使用 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 都支持此功能。

    【讨论】:

      【解决方案2】:
      <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[*]");
      

      不要忘记忽略 POJO 中未使用的“defaultParameterValue”。

      @JsonIgnoreProperties({"defaultParameterValue"})
      private static class JobParameter {
      
          private String description;
          private String name;
          private String type;
      

      【讨论】:

      • 很有趣,但没有回答问题:-)
      【解决方案3】:

      使用包装器 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;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-03
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多