jackson没有填充所有财产
我正在研究一个使用Jackson library
将json
字符串转换回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]
根据我的程序, prop1
和prop3
不应为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
)中的ObjectMapper
和JsonIgnoreProperties
以及版本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注释
- 与JS.fasterxml.jackson JacksonJaxbJsonProvider的@XMLElementWrapper问题
- jackson – 由于构造函数导致的JsonMappingException
- 在JavaEE应用程序中使用Jackson作为JAXB-JSON处理器
- 使用jackson解析Json文件
- 如何使用Android上的Jackson将JSON数组解析为不同的对象?
- 如何使用jackson将java对象序列化为xml属性?
- Java Camel框架:丢失处理器中的消息体
- Jackson 2.1多态反序列化:如何在pojo上填充类型字段?
- Jackson + Tomcat – java.lang.VerifyError:无法从最终类inheritance