Сопоставление полей между JSON схемами - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время я получаю JSON полезную нагрузку из конечной точки отдыха, в которой мне нужно выполнить отображение / преобразование для последующего сохранения в mon go DB (все еще как JSON Object).

Чтобы привести пример, давайте предположим, что ниже приведен источник JSON

{
   "location": "London",
   "temp": 15,
   "weather": "Cloudy"
}

И это необходимо сохранить в Mon go DB все еще в json, однако поле location необходимо сопоставить place вместо этого

{
   "place": "London",
   "temp": 15,
   "weather": "Cloudy"
}

Есть ли способ добиться этого с помощью Джексона (в больших масштабах у меня почти 400 полей), кроме создания настраиваемого десериализатора?

Ответы [ 2 ]

1 голос
/ 11 июня 2020

Я построил на решении @Alex, представленном выше, и придумал неинвазивное решение, которое отменяет класс JSON, не изменяя его с помощью MixIns Джексона.

Мне пришлось сделайте это, потому что я использую схему JSON для создания POJO, поэтому я не могу вносить в них какие-либо изменения.

Предположим, у нас есть исходный класс со свойством с именем originalProperty, которое мы хотим сопоставить иметь имя mixedProperty

class Source {
    @JsonProperty("originalProperty")
    int originalProperty;

    @JsonProperty("anotherProperty")
    int anotherProperty;
}

Для этого мы создаем класс MixIn, который обычно является классом, содержащим только свойства, которые мы хотим переопределить

class MixIn {
    @JsonProperty("mixedProperty")
    @JsonAlias("originalProperty")
    int originalProperty;
}

Примечание здесь мы изменили аннотацию @JsonProperty для ссылки на новое имя свойства mixedProperty и добавили новую аннотацию @JsonAlias с исходным именем свойства originalProperty

Все готово, теперь, когда вам нужно чтобы смешать все вместе

class JsonCooker {
    public static void main(String[] args) throws Exception {
        String originalJson = "{\"originalProperty\": 1, \"anotherProperty\" :2 }";

        ObjectMapper objectMapper = new ObjectMapper();

        Source updatedSource = objectMapper
                .addMixIn(Source.class, MixIn.class)
                .readValue(originalJson, Source.class);

        String updatedJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(updatedSource);
        System.out.println(updatedJson);
    }
}

И результат будет

{
  "mixedProperty" : 1,
  "anotherProperty" : 2
}
1 голос
/ 27 мая 2020

@JsonAlias может использоваться для десериализованного значения:

@JsonPropertyOrder(alphabetic = true)
public class Source {
    @JsonAlias("temp")
    int temperature; 

    @JsonAlias("location")
    @JsonProperty("place")
    String place;

    String weather;
// getters/setters
}
// testing
ObjectMapper om = new ObjectMapper();
String json = "{\"location\": \"London\",\n" +
                "   \"temp\": 15,\n" +
                "   \"weather\": \"Cloudy\"\n" +
                "}";
Source src = om.readValue(json, Source.class);
System.out.println(om.writerWithDefaultPrettyPrinter().writeValueAsString(src));

Выход (поле температуры с использованием фактического имени свойства в POJO):

{
  "place" : "London",
  "temperature" : 15,
  "weather" : "Cloudy"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...