XMLElements 选择的 Json 版本

Json version of XMLElements choice

提问人:obsessiveCookie 提问时间:1/16/2018 最后编辑:obsessiveCookie 更新时间:1/6/2021 访问量:1788

问:

对于具有以下注释的 Java 代码:

@JsonProperty(value="Contact")
    @NotNull(message = "ContactUser or CompanyName is required.")
    @Valid
    @XmlElements(value = {
            @XmlElement(name = "ContactUser", type = ContactUser.class, required = true),
            @XmlElement(name = "CompanyName", type = String.class, required = true) })  
    private Object contactInfo;

当我将对象用于 GET 时,结果集为:

"Contact": {
    "ContactUser": {
        "Title": "Miss",
        "LastName": "Hello"
    }
}

"Contact": "Hello Company"

有没有办法让它返回:

"ContactUser": {
    "Title": "Miss",
    "LastName": "Hello"
}

"CompanyName": "Hello Company"

相反?在 xml 中,使用代码,您可以执行以下操作:

 <CompanyName>Hello Company</CompanyName>

<ContactUser>
    <Title>Miss</Title>
    <LastName>Hello</LastName>
</ContactUser>

我尝试使用JsonTypeInfo,但它似乎没有处理String.class:

 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include =JsonTypeInfo.As.WRAPPER_OBJECT, visible=true)
    @JsonSubTypes({
        @JsonSubTypes.Type(name = "ContactUserJ", value = ContactUser.class),
        @JsonSubTypes.Type(name = "CompanyNameJ" , value = String.class)
    })
Java JSON XML BEAN-VALIDATION

评论

2赞 LMC 1/20/2018
Object 类型似乎太通用了。
0赞 JPRLCol 1/26/2018
我想你想根据填写的信息返回一个或另一个?
0赞 JPRLCol 1/26/2018
我认为,如果 Object contactInfo 是 Map 的实例,您可以轻松地添加一个条件来放置键和值(如果存在 ContactUser 或 CompanyName)

答:

0赞 JPRLCol 1/26/2018 #1

你在用弹簧吗?我使用了一个简单的 java 类 在简单的 java 中,我得到了

{
   "ContactUser" : {
    "Title" : "sampleTitle",
    "LastName" : "sampleLastName"
     },
    "CompanyName" : "XXXXX"
}

你能改写你的问题吗?我想我完全不明白你的意图是什么。

这是我的代码:

@JsonProperty(value = "Contact")
@XmlElements(value = {
    @XmlElement(name = "ContactUser", type = ContactUser.class, required = true)
    ,
        @XmlElement(name = "CompanyName", type = String.class, required = true)})
private Object contactInfo;

public TestClassConstructor() throws JsonProcessingException {
    contactInfo = new HashMap<String, Object>();
    ((HashMap) contactInfo).put("ContactUser", new ContactUser("sampleTitle", "sampleLastName"));
    ((HashMap) contactInfo).put("CompanyName", "XXXXX");

    ObjectMapper mapper = new ObjectMapper();
    String jsonResult = mapper.writerWithDefaultPrettyPrinter()
            .writeValueAsString(contactInfo);
    System.err.println(jsonResult);
}

如果您想拥有特定的序列化程序,则需要检查:http://www.baeldung.com/jackson-serialize-field-custom-criteria