【问题标题】:jackson json to Object parsingjackson json 到对象解析
【发布时间】:2016-12-02 14:13:00
【问题描述】:

我的任务是将 Json 解析为 Java 类。

我正在尝试解析并遇到问题的 Json 片段类似于树结构。

这里的重点是parameterValue可能是字符串,也可能是另一个参数名/值对数组;

我想使用 Jackson 映射器

Response response = mapper.readValue(jsonObjstring, Response.class);

这里的问题是我不知道如何在这里描述 Response 类,所以它可以被 Jackson 自动解析。如果有可能的话。

json:

[{
  "parameterName" : "name",
  "parameterValue" : "value"
}, {
  "parameterName" : "apnRecord",
  "parameterValue" : [{
     "parameterName" : "name",
     "parameterValue" : "value"
  }, {
     "parameterName" : "name",
     "parameterValue" : "value"
  }, {
     "parameterName" : "name",
     "parameterValue" : "value"
  }, {
     "parameterName" : "name",
     "parameterValue" : "value"
  }, {
     "parameterName" : "name",
     "parameterValue" : "value"
  }, {
     "parameterName" : "name",
     "parameterValue" : "value"
  }]
}]

【问题讨论】:

  • 分享你的代码sn-p,而不是仅仅抛出json

标签: java json jackson


【解决方案1】:

你可以试试这个在线 json to java pojo mapper,它会产生所需的结果,而且对我来说很多次都派上用场。

http://pojo.sodhanalibrary.com/

尝试一下,如果您遇到更多困难,请提供您收到的完整 json,我们可以解决其他问题。

【讨论】:

    【解决方案2】:

    创建一个 POJO Response.java 类,其中包含您的字段和 getter/setter,创建一个标准构造函数和一个包含您的字段的构造函数,以及一个 toString 方法()。我给你看一个带有注释的例子

    定义类如:

    @JsonAutoDetect
    @JsonSerialize
    public class Response implements Serializable
    

    然后你的字段与

    @JsonProperty
    private String parameterName;
    

    最后是你的构造函数 f.e.像这样

    @JsonCreator
    public Response(@JsonProperty("parameterName") String parameterName) {
        this.parameterName = parameterName;
    }
    

    【讨论】:

    • 但是当 Value 可能是字符串或数组时,这个 pojo 应该是什么样子?
    • tomas,这个参数名是一个字符串,如果你想要更多像 parameterValue 这样的变量,只需如图所示定义它们,如果你问如何将它们解析成一个数组列表,我就是这样做的 -> ArrayList images = jsonMapper.readValue(json, jsonMapper.getTypeFactory().constructCollectionType(ArrayList.class, Image.class));
    【解决方案3】:

    我已经定义为

    private List<List<Object>> resultParameters;

    然后jackson maper将它(对象)解析为LinkedHashMapEnty,当它是最终值或ArrayList - 如果它不是一个值而是另一个值列表;

    可以关闭;

    【讨论】:

      【解决方案4】:
      package test;
      
      import java.io.IOException;
      
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.JsonNode;
      import com.fasterxml.jackson.databind.ObjectMapper;
      
      public class Test {
      
          public static void main(String[] args) {
      
              String readJsonAsString = "[{\r\n  \"parameterName\" : \"name\",\r\n  \"parameterValue\" : \"value\"\r\n}, {\r\n  \"parameterName\" : \"apnRecord\",\r\n  \"parameterValue\" : [{\r\n     \"parameterName\" : \"name\",\r\n     \"parameterValue\" : \"value\"\r\n  }, {\r\n     \"parameterName\" : \"name\",\r\n     \"parameterValue\" : \"value\"\r\n  }, {\r\n     \"parameterName\" : \"name\",\r\n     \"parameterValue\" : \"value\"\r\n  }, {\r\n     \"parameterName\" : \"name\",\r\n     \"parameterValue\" : \"value\"\r\n  }, {\r\n     \"parameterName\" : \"name\",\r\n     \"parameterValue\" : \"value\"\r\n  }, {\r\n     \"parameterName\" : \"name\",\r\n     \"parameterValue\" : \"value\"\r\n  }]\r\n}]";
      
              try {
      
                  ObjectMapper mapper = new ObjectMapper();
                  JsonNode jsonNodes = mapper.readTree(readJsonAsString.toString());
                  for (JsonNode jsonNode : jsonNodes) {
                      System.out.println(jsonNode.get("parameterName"));
                  }
      
      
              } catch (JsonProcessingException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
          }
      
      }
      

      首先需要将json转成字符串格式,然后通过ObjectMapper转成树形结构。

      为此,您需要使用 3 个罐子: 杰克逊注释-2.3.5.jar 杰克逊核心2.3.5.jar jackson-databind-2.3.5.jar

      【讨论】:

        猜你喜欢
        • 2012-07-25
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多