jackson没有填充所有财产

我正在研究一个使用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不应为null。 我不清楚我犯错的地方。

更新:

如果我删除@JsonProperty注释,那么我得到的exception如下:

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

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

  com.fasterxml.jackson.core jackson-core 2.6.0   com.fasterxml.jackson.core jackson-annotations 2.6.0   org.codehaus.jackson jackson-mapper-asl 1.9.13  

您在评论中说,您在版本“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,那么结果是正常的:

样本[prop1 = 1,prop2 = 2,prop3 = 3,prop4 = 4]

(对彼此而言)

因此,我建议您确保不要混合使用过的库,我建议使用最新版本,该版本来自FasterXML 。 但是使用的版本取决于你。

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

  • org.codehaus.jackson v1.9.13

  • com.fasterxml.jackson(core)v2.6.0

顺便说一下你的评论:

@OldCurmudgeon,感谢您的回复。 将字段更改为公共并未解决问题。 我删除了@JsonProperty注释,然后将setter方法更改为setProp_1和setProp_3,它工作正常。 这是否意味着@JsonProperty注释存在问题?

是的,你有(或希望有:P)这个注释的问题:它来自不同的jackson版本。

关于您的编辑:

从maven存储库中的fasterXML到Jackson lib的链接有一个很大的优势:它显示了你应该下载哪个lib来与你的项目中的Jackson一起工作。

你需要:

  • Jackson Databind (也有ObjectMapper类)
  • jackson核心
  • jackson注释