Я пытаюсь проанализировать следующий JSON в Джексоне:
{
"x:y" : 1,
"x:z" : 2,
"u:v" : 3,
// Several dynamically generated entries...
}
Данные отформатированы таким образом и вне моего контроля. Записи несколько динамичны, но всегда имеют вид:
"first:second" : value
Я пытался сериализовать это в контейнерный класс:
private static class MyClass {
String first;
String second;
Number value;
@JsonCreator
public MyClass(@JsonProperty("both") String both, @JsonProperty("value") Number value) {
String[] split = both.split(":");
first = split[0];
second = split[1];
this.value = value;
}
}
Но я получаю сообщение об ошибке:
Исключение в потоке "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Невозможно десериализовать экземпляр entry.JacksonObjectTest $ MyClass [] из маркера START_OBJECT
Имеет смысл для меня; Я пытаюсь разобрать каждое поле объекта JSON в массив объектов, и Джексон, очевидно, не слишком рад этому. Пренебрежение @JsonProperty("both")
дает:
Исключение в потоке "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Неверное определение типа для типа entry.JacksonObjectTest $ MyClass: Аргумент # 0 не имеет имени свойства, не является Injectable: не может использоваться как Creator [ конструктор для entry.JacksonObjectTest $ MyClass, аннотации: {interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator (mode = DEFAULT)}]
Что также имеет смысл для меня; он не имеет ни малейшего понятия, как анализировать этот конструктор (что на самом деле та же проблема, что и выше; я помещаю аннотацию просто маскируя эту ошибку другим).
Итак, мой вопрос: как заставить Джексона понять, чего я хочу здесь?
MCVE
public class JacksonObjectTest {
public static void main(String[] args) throws IOException {
String data = "{\"x:y\":1,\"x:z\":2,\"u:v\":3}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(data);
MyClass[] out = mapper.readValue(node.traverse(), MyClass[].class);
System.out.println(out);
}
private static class MyClass {
String first;
String second;
Number value;
@JsonCreator
public MyClass(@JsonProperty("both") String both, @JsonProperty("value") Number value) {
String[] split = both.split(":");
first = split[0];
second = split[1];
this.value = value;
}
}
}
EDIT : Как уже упоминалось в комментариях, я знаю о способе использования TypeReference<Map<String,Number>>
. Это работает, но я пытался сделать мой синтаксический код как можно более обобщенным и универсальным, и использование этого решения означает, что мне нужно выполнить дополнительное преобразование после анализа, чтобы получить MyClass[]
(сначала анализ для Map<String,Number>
, затем обработка что за MyClass[]
). Есть ли способ пропустить посредника (IE: скажите Джексону, как обработать блоб JSON известного форматирования в тип данных)?