当前位置: 首页 > 面试题库 >

杰克逊未填充所有属性

安轶
2023-03-14
问题内容

我正在研究一个简单的示例,该示例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]

根据我的程序,prop1and prop3不应为null。我不清楚我在哪里犯错。

更新:

如果删除@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>

问题答案:

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

我可以重现你的问题,如果我使用混合版本ObjectMapper,并JsonIgnoreProperties从1.9.13版本(org.codehaus),并JsonProperty从2.6.0版本(com.fasterxml)。

输出:

样本[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(核心)v2.6.0

顺便说一句关于您的评论:

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

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

关于您的修改

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

你需要:

  • 杰克逊·德宾宾德(也有该ObjectMapper课程)
  • 杰克逊核心
  • 杰克逊注释


 类似资料:
  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 我还在学习如何使用Jackson。。。 所以我有一个JSON对象,它的值有时是整数、长字符串或列表 值:整数 值:字符串 价值:列表 所以总的来说。。。 这是我的POJO模型 这是我的映射器代码 问题是,当我执行代码时,出现以下错误: 我很清楚,之所以会发生这种情况,是因为“value”可以包含三种不同类型中的一种,我如何使代码足够灵活以适应这些类型。。。我总是可以在其他方法中检测值是int、Li

  • 我已经发布了类似的东西,但我仍然试图集中在我的问题上。 谢谢你能容忍我。 com.fasterxml.jackson.databind.jsonMappingException:无法构造FHIR.Element的实例,问题:抽象类型要么需要映射到具体类型,有自定义的反序列化器,要么需要在com.fasterxml.jackson.databind.jsonMappingException.from

  • 问题内容: 我可以有条件地使用@JsonUnwrapped吗?我不想在序列化过程中使用它,但想在反序列化对象时使用它。 一种实现方法是创建两个不同的类或创建一个子类,该子类仅覆盖需要在序列化和反序列化时表现不同的属性。这听起来不对。还有其他替代方法或Jackson的解决方法吗? 问题答案: 您可以使用MixIn功能。使用此要素类与注释分离。您可以使用在运行时中添加必要的注释。请参见以下示例: 上面

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A