Как я могу узнать, можно ли преобразовать тип Java из / в JSON - PullRequest
0 голосов
/ 29 марта 2020

JSON -B преобразует типы, такие как LocalDate, в / из простой строки. Когда у меня есть Type, как я могу узнать, будет ли JSON -B преобразовывать этот тип напрямую, т.е. если это скалярный тип?

У меня нет экземпляра, поэтому я могу ' даже не пытайтесь преобразовать его в строку и посмотреть, содержит ли он фигурные скобки.

Или мне нужно искать типы, которые имеют метод valueOf или parse, или конструктор, имеющий ровно одну строку параметр

1 Ответ

0 голосов
/ 29 марта 2020

Можно заранее проверить, можно ли сериализовать данный тип в JSON (т.е. преобразовать из строго типизированного в слабо типизированный формат), но нет способа проверить, можно ли десериализовать данный тип в POJO до тех пор, пока вы не получите фактическое значение JSON во время выполнения (т. е. конвертирование из слабо типизированного формата в строго типизированный формат).

В общем случае правила для сериализуемого типа просты:

  • Класс должен быть доступен (опубликован c или защищен)
  • Если класс является внутренним классом, он должен быть установлен c
  • Ноль или более publi c поля / получатели, которые содержат / возвращают сериализуемые типы

В общем случае правила для десериализуемого типа:

  • Класс должен быть доступен (publi c или защищен)
  • Если класс является внутренним классом, он должен быть установлен c
  • Ноль или более publi c полей / сеттеров, которые содержат / возвращают десериализуемые типы
  • Класс должен иметь паблику c конструктор без аргументов (или ctor, помеченный @JsonbCreator)
  • ИЛИ У класса должен быть фабричный метод c stati c, аннотированный @JsonbCreator

Вы можете обнаружить, что то, что составляет «конвертируемый тип», является очень широким критерием в JSON -B (или любой другой библиотеке Java JSON). Например, строка JSON string {} может быть десериализована в любой тип, который имеет конструктор publi c no-args. Аналогично, класс Java, у которого нет полей publi c или методов-получателей, будет сериализован в строку JSON {}.

Поскольку конвертируемый тип является таким широким термином, было бы полезно если вы укажете немного дальше, чего вы пытаетесь достичь - возможно, есть более конкретный c подход, который я мог бы предложить.


Дополнительная информация:

Многие из наиболее распространенных поддерживаются используемые классы из JDK. См. разделы 3.3 - 3.5 JSON -B spe c для полного списка. Помимо встроенных классов, требования указаны в разделе 3.7 JSON -B spe c.

Для десериализации существует больше требований, чем для сериализации. Они подробно описаны в разделе 3.7 и в разделе 4.5 .

...