当前位置: 首页 > 知识库问答 >
问题:

Jackson有条件的@Json未包装

郎鸿朗
2023-03-14

我可以有条件地使用@JsonUnwrapped吗?我不想在序列化期间使用它,但希望在反序列化对象时使用它。

一种方法是创建两个不同的类,或者创建一个子类覆盖那个属性,这个属性在序列化和反序列化时需要表现得不同。这听起来不太对。还有其他替代方法吗?或者杰克逊解决这个问题的方法吗?

共有2个答案

孙正业
2023-03-14

有一种更简单的方法可以达到同样的效果,这种方法只基于注释:

@JsonUnwrapped(prefix = "name_")
@JsonProperty(access = READ_ONLY)
private Name nameObject;

// method will deserialize original JSON and set it to unwrapped field
@JsonSetter
public void setName(Name name) {
  this.nameObject = name;
}

// simple getter
@JsonIgnore
public Name getName() {
  return this.nameObject;
}
闽阳州
2023-03-14

您可以使用万象网功能。使用此功能,POJO 类与杰克逊注释分离。您可以使用 MixIn 在运行时添加必要的注释。请参阅以下示例

import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTest {

    private static final String UNWRAPPED_JSON = "{\n" +
            "  \"age\" : 13,\n" +
            "  \"first\" : \"Huckleberry\",\n" +
            "  \"last\" : \"Finn\"\n" +
            "}";

    @Test
    public void test() throws IOException {
        System.out.println("### Serialize without unwrapped annotation ###");
        ObjectMapper serializer = new ObjectMapper();
        System.out.println(serializer.writerWithDefaultPrettyPrinter().writeValueAsString(createParent()));

        System.out.println("### Deserialize with unwrapped annotation ###");
        ObjectMapper deserializer = new ObjectMapper();
        deserializer.addMixInAnnotations(Parent.class, ParentMixIn.class);
        System.out.println(deserializer.readValue(UNWRAPPED_JSON, Parent.class));
    }

    private Parent createParent() {
        Name name = new Name();
        name.first = "Tom";
        name.last = "Sawyer";

        Parent parent = new Parent();
        parent.setAge(12);
        parent.setName(name);

        return parent;
    }
}

class Parent {

    private int age;
    private Name name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Parent{" +
                "age=" + age +
                ", name=" + name +
                '}';
    }
}

interface ParentMixIn {

    @JsonUnwrapped
    Name getName();
}

class Name {

    public String first, last;

    @Override
    public String toString() {
        return "Name{" +
                "first='" + first + '\'' +
                ", last='" + last + '\'' +
                '}';
    }
}

以上程序打印:

### Serialize without unwrapped annotation ###
{
  "age" : 12,
  "name" : {
    "first" : "Tom",
    "last" : "Sawyer"
  }
}

### Deserialize with unwrapped annotation ###
Parent{age=13, name=Name{first='Huckleberry', last='Finn'}}
 类似资料:
  • 每次我尝试调用REST服务时,都会收到以下错误消息 以下是REST服务(剥离到相关部分): JSON类 波姆。xml(有趣的部分) 我的设置是: JDK8/JEE7(build 1.8.0_51-b16) 这就是我迄今为止所尝试的: 找不到媒体类型为application/json的MessageBodyWriter- 我仍然认为这是一个依赖问题。但是我不知道会有什么问题。

  • 问题内容: 我有一个组件,有时有时需要呈现为和,有时需要呈现为。在我读来确定这一点,是。 如果存在,则需要将组件包装在中。否则,它将仅呈现为。 可能? 这是我现在正在做的,但是感觉可以简化: 更新: 这是最终的锁定。感谢您的提示,@ Sulthan! 问题答案: 只需使用一个变量。 或者,您可以使用辅助函数来呈现内容。JSX和其他代码一样。如果要减少重复,请使用函数和变量。

  • 我正在使用Spring MVC RESTful Web服务 组织。springframework。网状物客户ResourceAccessException:POST请求“http://”时发生I/O错误:服务器返回了URL:http://嵌套异常为java的http响应代码:415。伊奥。IOException:服务器返回了URL:HTTP:的HTTP响应代码:415// 原因:java。伊奥。I

  • Spring Boot应用程序的任务是每隔这么多分钟更新一次远程集成API。此应用程序可以部署到测试或prod环境中,通过“application.properties”标志通知应用程序应该查看的endpoint。POJO被Jackson序列化并推送到endpoint,JsonProperty注释包含它被推送到的API的字段ID。 ie 这些值的字段标签在测试endpoint上不同。因此,测试en

  • 我需要创建一个自定义序列化程序,有条件地跳过字段。与使用jackson序列化时有条件跳过对象中描述的情况不同,我的类包含一个POJO成员。PersonalInfo有一个成员地址。如果地址被隐藏,结果JSON仍然有“Address”标记,但没有值。我想不出怎么解决这个问题。 在ObjectMapper上创建自定义序列化程序(参见3. athttp://www.baeldung.com/jackson

  • 知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。