Java类来生成给定的JSON字符串

Java类来生成给定的JSON字符串,java,json,jackson,Java,Json,Jackson,我很难想出一个代表以下JSON的类。“家庭关系”是一组数组。每个数组都有person1和person2标识符以及person1和person2之间的关系。正如您可能已经猜到的,数组中值的顺序非常重要。例如,如果“12345”和“31142”位置切换,则表示“31142”是“12345”的父项,这是完全错误的 { "familyRelationships": [ [ "12345", "SPOUSE",

我很难想出一个代表以下JSON的类。“家庭关系”是一组数组。每个数组都有person1和person2标识符以及person1和person2之间的关系。正如您可能已经猜到的,数组中值的顺序非常重要。例如,如果“12345”和“31142”位置切换,则表示“31142”是“12345”的父项,这是完全错误的

{
    "familyRelationships": [
        [
            "12345", 
            "SPOUSE", 
            "67890", 
            {
                "careTaker": false,
                "liveTogether": true
            }
        ],
        [
            "12345", 
            "PARENT", 
            "31142", 
            {
                "careTaker": true,
                "liveTogether": true
            }
        ],
        [
            "67890", 
            "PARENT", 
            "31142", 
            {
                "careTaker": true,
                "liveTogether": true
            }
        ]
    ]
}

网上有一些工具可以帮你做到这一点

package com.example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"familyRelationships"
})
public class Example {

@JsonProperty("familyRelationships")
private List<List<String>> familyRelationships = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("familyRelationships")
public List<List<String>> getFamilyRelationships() {
return familyRelationships;
}

@JsonProperty("familyRelationships")
public void setFamilyRelationships(List<List<String>> familyRelationships) {
this.familyRelationships = familyRelationships;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
package.com.example;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入com.fasterxml.jackson.annotation.JsonAnyGetter;
导入com.fasterxml.jackson.annotation.JsonAnySetter;
导入com.fasterxml.jackson.annotation.JsonIgnore;
导入com.fasterxml.jackson.annotation.JsonInclude;
导入com.fasterxml.jackson.annotation.JsonProperty;
导入com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
“家庭关系”
})
公开课范例{
@JsonProperty(“家庭关系”)
private List familyRelationships=null;
@杰索尼奥雷
私有映射additionalProperties=new HashMap();
@JsonProperty(“家庭关系”)
公共列表getFamilyRelationships(){
回归家庭关系;
}
@JsonProperty(“家庭关系”)
public void设置家庭关系(列出家庭关系){
这个。家庭关系=家庭关系;
}
@JsonAnyGetter
公共映射getAdditionalProperties(){
返回此。附加属性;
}
@JSONANYSETER
public void setAdditionalProperty(字符串名称、对象值){
this.additionalProperties.put(名称、值);
}
}

这仅仅是一种可能的使用

的方法。网上有一些工具可以帮你做到这一点

package com.example;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"familyRelationships"
})
public class Example {

@JsonProperty("familyRelationships")
private List<List<String>> familyRelationships = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("familyRelationships")
public List<List<String>> getFamilyRelationships() {
return familyRelationships;
}

@JsonProperty("familyRelationships")
public void setFamilyRelationships(List<List<String>> familyRelationships) {
this.familyRelationships = familyRelationships;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
package.com.example;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入com.fasterxml.jackson.annotation.JsonAnyGetter;
导入com.fasterxml.jackson.annotation.JsonAnySetter;
导入com.fasterxml.jackson.annotation.JsonIgnore;
导入com.fasterxml.jackson.annotation.JsonInclude;
导入com.fasterxml.jackson.annotation.JsonProperty;
导入com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
“家庭关系”
})
公开课范例{
@JsonProperty(“家庭关系”)
private List familyRelationships=null;
@杰索尼奥雷
私有映射additionalProperties=new HashMap();
@JsonProperty(“家庭关系”)
公共列表getFamilyRelationships(){
回归家庭关系;
}
@JsonProperty(“家庭关系”)
public void设置家庭关系(列出家庭关系){
这个。家庭关系=家庭关系;
}
@JsonAnyGetter
公共映射getAdditionalProperties(){
返回此。附加属性;
}
@JSONANYSETER
public void setAdditionalProperty(字符串名称、对象值){
this.additionalProperties.put(名称、值);
}
}

由于数组中包含的类型不一致,JSON不会很好地成为POJO,这仅是一种可能性:

e、 g


字符串,字符串,字符串,对象
。唯一有效的方法是如果您有一个
对象[]
列表
。所以家庭关系实际上应该是一个列表。最终结果将需要一系列强制转换(可能还需要一些检查以确保给定索引中的项是您期望的类),但它会起作用。

JSON不会很好地成为POJO,因为数组中包含的类型不一致:

e、 g


字符串,字符串,字符串,对象
。唯一有效的方法是如果您有一个
对象[]
列表
。所以家庭关系实际上应该是一个列表。最终的结果将需要一系列转换(可能还需要一些检查以确保给定索引处的项是您期望的类),但它会起作用。

这应该可以使用自定义反序列化器来实现

在我看来,一个关系应该被建模为一个具有专有名称的java类。请注意,构造函数将a作为参数,并且我已经留下了我们的任何getter和setter:

public class Relationship {

    private final String id1;
    private final String id2;
    private final Relation relation;
    private final boolean careTaker;
    private final boolean liveTogether;

    public Relationship(JsonNode base) {
        this.id1 = base.get(0).asText();
        this.id2 = base.get(2).asText();
        this.relation = Relation.valueOf(base.get(1).asText());
        this.careTaker = base.get(3).get("careTaker").asBoolean();
        this.liveTogether = base.get(3).get("liveTogether").asBoolean();
    }

    public enum Relation {
        PARENT,
        SPOUSE;
    }

}
我们还需要一个存储集合的类。这是您将顶级对象反序列化为的对象(再次省略getter和setter):

我希望这会有所帮助,我还没有实际测试过任何一个,它甚至可能不会编译,但原则应该是正确的。我还假设JSON是您提供的格式。如果这不是保证,那么您需要进行适当的检查并处理任何偏差


如果您还希望能够序列化所有内容,则需要实现see以获取更多详细信息。

这应该可以使用自定义反序列化器实现

在我看来,一个关系应该被建模为一个具有专有名称的java类。请注意,构造函数将a作为参数,并且我已经留下了我们的任何getter和setter:

public class Relationship {

    private final String id1;
    private final String id2;
    private final Relation relation;
    private final boolean careTaker;
    private final boolean liveTogether;

    public Relationship(JsonNode base) {
        this.id1 = base.get(0).asText();
        this.id2 = base.get(2).asText();
        this.relation = Relation.valueOf(base.get(1).asText());
        this.careTaker = base.get(3).get("careTaker").asBoolean();
        this.liveTogether = base.get(3).get("liveTogether").asBoolean();
    }

    public enum Relation {
        PARENT,
        SPOUSE;
    }

}
我们还需要一个存储集合的类。这是您将顶级对象反序列化为的对象(再次省略getter和setter):

我希望这会有所帮助,我还没有实际测试过任何一个,它甚至可能不会编译,但原则应该是正确的。我还假设JSON是您提供的格式。如果这不是保证,那么您需要进行适当的检查并处理任何偏差


如果您还希望能够序列化所有内容,则需要实现see以了解更多详细信息。

我了解该工具。生成的类没有帮助。“家庭关系”不是字符串数组。注意这个对象有两个属性“careTaker”和“liveTogether”。我知道这个工具。生成的类没有帮助。“家庭关系”不是字符串数组。
class FamillyRelationshipsDeserializer extends JsonDeserializer<FamillyRelationships> {
    @Override
    public FamillyRelationships deserialize(JsonParser jp, DeserializationContext ctxt) throws 
            IOException, JsonProcessingException {
        FamillyRelationships relationships = new FamillyRelationships();
        JsonNode node = jp.readValueAsTree();
        JsonNode rels = node.get("familyRelationships");

        for (int i = 0; i < rels.size(); i++) {
            relationships.familyRelationships.add(new Relationship(rels.get(i));
        }

        return relationships;
    }
}