【问题标题】:Jackson not populating all properties杰克逊没有填充所有属性
【发布时间】:2015-10-12 04:11:51
【问题描述】:

我正在研究一个使用Jackson libraryjson 字符串转换回Java object 的简单示例,但我看到我的java 对象上只设置了几个属性而不是所有属性。

这是我的代码:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.codehaus.jackson.map.ObjectMapper;

public class JsonTest {
    public static void main(String[] args) throws FileNotFoundException, IOException {

        StringBuffer buffer = new StringBuffer();       
        String data = "";
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("path-to-sample.json"));
            while ((data = reader.readLine()) != null) {
                buffer.append(data);
            }
        } finally {
            if (reader != null) {
                reader.close(); 
            }
        }

        System.out.println(buffer.toString());

        ObjectMapper mapper = new ObjectMapper();
        Sample obj = mapper.readValue(buffer.toString(), Sample.class);


        System.out.println(obj);
    }
}

Sample.java 程序如下所示:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Sample {

    @JsonProperty("prop_1")
    private String prop1;
    private String prop2;
    @JsonProperty("prop_3")
    private String prop3;
    private String prop4;

    // Setters & Getters for the properties.

    @Override
    public String toString() {
        return "Sample [prop1=" + prop1 + ", prop2=" + prop2 + ", prop3="
                + prop3 + ", prop4=" + prop4 + "]";
    }

}

在我的文件中输入 json 字符串是:

{
    "prop_1": "1",
    "prop2": "2",
    "prop_3": "3",
    "prop4": "4"
}

这个程序的输出是:

Sample [prop1=null, prop2=2, prop3=null, prop4=4]

根据我的程序,prop1prop3 不应为空。我不清楚我在哪里犯了错误。

更新:

如果我删除 @JsonProperty 注释,那么我会得到以下异常:

Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "prop_1" (Class Sample), not marked as ignorable

这是我的 pom.xml 文件依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>       

【问题讨论】:

  • 您使用的是哪个版本的jackson?
  • 该注释适用于我更喜欢​​的球衣/杰克逊。
  • @SachinGupta,版本是2.5.4
  • @user2130951,我不认为杰克逊的使用仅限于泽西岛。
  • 尝试创建属性public。或者尝试public void setProp_1(String prop1) { this.prop1 = prop1; }

标签: java json jackson


【解决方案1】:

您在评论中说,您正在使用版本 “2.5.4” 中的 Jackson,但您正在从 org.codehaus 包中导入 ObjectMapper 类。这意味着,这个类来自版本 1.9.13(或来自旧版本)。

如果我混合使用版本 1.9.13 (org.codehaus) 中的 ObjectMapperJsonIgnoreProperties 以及版本 2.6.0 (com.fasterxml) 中的 JsonProperty 的版本,我可以重现您的问题。

输出:

示例 [prop1=null, prop2=2, prop3=null, prop4=4]

如果我只使用1.9.13或2.6.0版本,那么结果就ok了:

示例 [prop1=1, prop2=2, prop3=3, prop4=4]

(两者都适用)

所以我建议确保不要混合使用的库,我建议使用来自FasterXML 的最新版本。 但使用的版本取决于您。

您可以从这里下载 jar 文件:

顺便说一下你的评论:

@OldCurmudgeon,感谢您的回复。将字段更改为 public 并没有解决问题。我删除了@JsonProperty 注释,然后将setter 方法更改为setProp_1 和setProp_3,它起作用了。那么是不是说明@JsonProperty注解有问题呢?

是的,您有(或希望有:P)该注释的问题:它来自不同的 Jackson 版本。

关于您的编辑:

maven 存储库中从 fastXML 到 Jackson 库的链接有一个很大的优势:它向您显示了应该下载哪个库以在您的项目中与 Jackson 一起使用。

你需要:

【讨论】:

  • 哇,非常感谢汤姆,问题现在解决了。正确我将JsonIgnorePropertiesJsonProperty 的注释与codehaus 和Jackson 混合在一起。你能告诉我正确的使用方法是什么,我应该使用 Jackson jars 还是 codehaus jars?
  • 嗯,首先:两者都是“杰克逊”:P,但 codehaus 是一个旧版本,将不再维护。因此,您应该使用来自 fastXML 的较新版本。您可以在此处找到最新版本:mvnrepository.com/artifact/com.fasterxml.jackson.core(链接也在答案中)。
  • 感谢您的澄清,但我在 Jackson jar 中没有看到任何 ObjectMapper。我正在尝试导入 ObjectMapper 的类文件,我只从 codehaus 获取。我已经用我的 pom.xml 文件中的依赖项更新了我的问题,请您检查并提出建议。
  • 该类在“Jackson Databind”库中。我已将该信息添加到答案中。
  • 大依赖的一个很好的替代品是。 org.glassfish.jersey.mediajersey-media-json-jackson2.9
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2020-03-30
  • 2017-03-04
相关资源
最近更新 更多