Простые старые Java-объекты из JSON или JSON-схемы - PullRequest
0 голосов
/ 07 января 2019

У меня есть объект Json, который я хочу преобразовать в POJO, проблема в том, что 1 из его свойств - это значение c, которое будет иметь разные значения, которые я не знаю заранее. Допустим, я ничего не знаю о "$key", или, может быть, названия городов по всему миру

{
    "data": [{
        "id": 1,
        "name": "theName",
        "symbol": "theSymbol",
        "last_updated": "2018-06-02T22:51:28.209Z",
        "quote": {
            "$key": {
                "price": 9283.92,
            },
            "$key": {
                "price": 1,

            }
        }
    }],
    "status": {
        "timestamp": "2018-06-02T22:51:28.209Z",
        "error_code": 0,
        "error_message": "",
        "elapsed": 10,
        "credit_count": 1
    }
}

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Вы можете сопоставить $key со свойством типа JsonNode. У него будет рабочий equals / hashCode, чтобы вы могли сравнить его, поместить в HashMaps и т. Д. Без необходимости дальнейшего связывания данных (JsonNode напрямую представляет дерево Json (sub)).

0 голосов
/ 07 января 2019

Поскольку «$ key» неизвестно, я предлагаю преобразовать quote в Map<String, Map<String, Integer>>, чтобы значение «$ key» можно было игнорировать! Это мой код:

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

import java.util.List;
import java.util.Map;

public class XmlParser {
    static class Entity {
        @JsonProperty("id")
        String id;
        @JsonProperty("name")
        String name;
        @JsonProperty("symbol")
        String symbol;
        @JsonProperty("last_updated")
        String lastUpdated;
        @JsonProperty("quote")
        Map<String, Map<String, Integer>> quote;
    }

    static class Data {
        @JsonProperty("data")
        List<Entity> data;
    }

    public static void main(String[] args) throws Exception {
    final String testJson = "{\"data\":[{\"id\":1,\"name\":\"theName\",\"symbol\":\"theSymbol\",\"last_updated\":\"2018-06-02T22:51:28.209Z\",\"quote\":{\"a\":{\"price\":9283.92},\"b\":{\"price\":1}}}]}";

        ObjectMapper mapper = new ObjectMapper();
        Data data = mapper.readValue(testJson, Data.class);
        System.out.println(mapper.writeValueAsString(data));
    }
}
0 голосов
/ 07 января 2019

Я бы решил это по-другому. Я бы сделал это своего рода «мета-объектом», например. как это:

{
....
"unknownType": {
    "name": "$key",
    "value1": "9283.92",
    "value2": "tttt"
    }
}

Таким образом, вы устранили один слой неизвестной информации! Вы можете попытаться выполнить синтаксический анализ полей valueN для всех различных типов значений и генерировать исключения для разброса / перехвата и, таким образом, найти правильный тип.

НТН

...