Java-классы для генерации заданной строки JSON - PullRequest
0 голосов
/ 05 мая 2018

Мне тяжело придумать класс, который представляет следующий JSON. «familyRelationships» представляет собой массив массивов. Каждый массив имеет идентификаторы 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
            }
        ]
    ]
}

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

То, что JSON не станет красивым POJO, потому что типы, содержащиеся в массивах, не согласованы:

, например

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

- это String,String,String,Object. Единственный способ, который работает, это если у вас есть Object[] или List<Object>. Так что familyRelationships на самом деле должно быть List<List<Object>>. Конечный результат потребует кучу приведений (и, возможно, некоторых проверок, чтобы убедиться, что элемент с заданным индексом является классом, который вы ожидаете), но он будет работать.

0 голосов
/ 05 мая 2018

Это должно быть выполнимо с помощью специального десериализатора.

Отношения по моему мнению должны быть смоделированы как правильный класс Java с именами. Обратите внимание, что конструктор принимает в качестве аргумента JSONNode, и я оставил все наши методы получения и установки:

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;
    }

}

Нам также нужен класс, в котором хранится коллекция. Это тот объект, в который вы бы десериализовали объект верхнего уровня (опять же, исключив геттеры и сеттеры):

@JsonDeserialize( using = FamillyRelationshipsDeserializer.class )
public class FamillyRelationships {

    public List<Relationship> familyRelationships = new ArrayList<>();

} 

Наконец, нам нужно реализовать фактический JsonDeserializer, указанный в приведенном выше классе. Это должно выглядеть примерно так. Я использовал этот вопрос в качестве ссылки:

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;
    }
}

Надеюсь, это поможет, я на самом деле не проверял ничего из этого, вероятно, он даже не будет компилироваться, но принципы должны быть правильными. Я также предположил, что формат JSON соответствует указанному вами формату. Если это не является гарантией, вам нужно будет выполнить соответствующие проверки и устранить любые отклонения.

Если вы также хотите иметь возможность сериализовать все, тогда вам нужно реализовать JsonSerializer см. этот вопрос для получения более подробной информации.

0 голосов
/ 05 мая 2018

В Интернете есть несколько инструментов, которые сделают это для вас

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);
}

}

Это только 1 возможность, сделанная с http://www.jsonschema2pojo.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...