【问题标题】:Convert JSON to Java Object using Jackson Framework使用 Jackson 框架将 JSON 转换为 Java 对象
【发布时间】:2015-03-30 14:34:05
【问题描述】:

我是 Jackson 框架的新手,在某些时候卡住了。我正在尝试将 JSON 消息转换为 Java 对象,但是我遇到了错误。您能否建议解决问题的行动方案。

错误:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "coord"

代码

@Test
    public void jsonToJava(){

        String responseString = "{  \n" +
                "   \"coord\":{  \n" +
                "      \"lon\":21.01,\n" +
                "      \"lat\":52.23\n" +
                "   }\n" +
                "}";

        ObjectMapper mapper = new ObjectMapper();

        try {
            Coord cor = mapper.readValue(responseString, Coord.class);
            System.out.println(cor);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

GetterAndSetter 类:

public class Coord {

    private Double lon;
    private Double lat;

    public Double getLon() {
        return this.lon;
    }

    public void setLon(Double lon) {
        this.lon = lon;
    }

    public Double getLat() {
        return this.lat;
    }

    public void setLat(Double lon) {
        this.lat = lat;
    }

}

【问题讨论】:

    标签: json jackson


    【解决方案1】:

    这将是您班级的正确 json 字符串

    String responseString = "{\"lon\":21.01,\"lat\":52.23}";
    

    还请更正您的 setLon 方法,替换为以下内容

    public void setLat(Double lat) {
        this.lat = lat;
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过多种方式做到这一点,这里有两种方式。

      在第一种方式中,您可以告诉ObjectMapper 解开根值:

      mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
      

      并将您的 Coord 类更改为如下内容:

      @JsonRootName("coord")
      public class Coord {
      
          private Double lon;
          private Double lat;
      
          // getters and setters
      
      }
      

      要使用@JsonRootName,您需要jackson-annotations。如果您使用的是 maven,只需添加以下内容:

      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.3</version>
      </dependency>
      

      如果您使用的是 gradle,请添加以下内容:

      compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.3'
      

      或从wikihere下载

      第二种方法,将您的 JSON 更改为如下所示:

      {
        "lon":21.01,
        "lat":52.23
      }
      

      【讨论】:

      • 谢谢布鲁诺。您能否建议使用哪个 jar 包,因为我无法解析 mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 的方法;我已经按照建议下载了 Annontation jar 文件,但仍然无法解决该方法
      • @user3463885 DeserializationFeatureObjectMapper 在同一个包中,它是com.fasterxml.jackson.databind。这里我使用的是杰克逊版本2.5.0,两个类都在jackson-databind jar 中。
      • @user3463885,你需要什么根元素?当你的问题仅仅修复你的 JSON 时,为什么你需要一个额外的注释?
      • @vzamanillo 的确,回应的方式是他自己选择的。
      • 确实,这是我的本意,不错的选择。简化他的代码。
      猜你喜欢
      • 2013-03-25
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2017-08-31
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多