Nano Hash - криптовалюты, майнинг, программирование

Сделайте Джексона более дружелюбным для ввода JSON

Есть ли у меня способ сделать Джексона менее требовательным к вводу JSON. Например. JSONObject предоставляет следующие допуски:

Конструкторы более снисходительны к текстам, которые они примут:

  1. Перед закрывающей фигурной скобкой может стоять дополнительная , (запятая).
  2. Строки могут заключаться в кавычки (одинарные кавычки).
  3. Строки вообще не нужно заключать в кавычки, если они не начинаются с кавычек или одинарных кавычек, и если они не содержат начальных или конечных пробелов, а также если они не содержат ни одного из следующих символов: { } [ ] / \ : знак равно # и если они не похожи на числа и если они не являются зарезервированными словами true, false или null.*
  4. За ключами могут следовать = или =>, а также :.
  5. За значениями может следовать ; (точка с запятой), а также , (запятая).
  6. Числа могут иметь префикс 0x- (шестнадцатеричный).

Наиболее интересным для меня является 3-й пункт. Это позволяет выполнить следующее преобразование:

new JSONObject("{A : 1}");

... но для Джексона я получу ошибку с тем же вводом json:

new ObjectMapper().readTree("{ A : 1}"); // throws an exception

Исключение:

org.codehaus.jackson.JsonParseException: Unexpected character ('A' (code 65)): was expecting double-quote to start field name
   at [Source: java.io.StringReader@26d4f1; line: 1, column: 4]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:943)
at org.codehaus.jackson.impl.JsonParserBase._reportError(JsonParserBase.java:636)
at org.codehaus.jackson.impl.JsonParserBase._reportUnexpectedChar(JsonParserBase.java:569)
at org.codehaus.jackson.impl.ReaderBasedParser._handleUnusualFieldName(ReaderBasedParser.java:342)
at org.codehaus.jackson.impl.ReaderBasedParser._parseFieldName(ReaderBasedParser.java:235)
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:125)
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:180)
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeAny(JsonNodeDeserializer.java:210)
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:52)
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:13)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1130)

Ответы:


1

Список расширений для нестандартного JSON (то есть того, что НЕ является JSON, но достаточно близко, чтобы его можно было поддерживать) можно найти по адресу: http://wiki.fasterxml.com/JacksonFeaturesNonStandard

Из вашего списка можно выполнить (2) и (3) (плюс несколько других вещей, не перечисленных, например, commnets). Другие не поддерживаются; и хотя проект добавил поддержку некоторых широко используемых расширений, существуют ограничения на то, что будет рассмотрено. Конечно, всегда можно запросить новые функции; функции добавляются на основе запроса, вариантов использования.

По моему личному мнению, следует либо следовать стандарту, либо определять новые форматы — HTML — хороший пример крысиных нор, в которые можно попасть, пытаясь поддерживать вещи, которые «почти, но не совсем» действительны. Доработкам нет конца, и страдает интероперабельность: поскольку стандарта нет, все реализации поддерживают некоторые несовместимые подмножества функций и конструкций.

12.04.2011

2

Ознакомьтесь с этим связанным вопросом. В нем показано, как настроить ObjectMapper, чтобы он делал то, что вы хотите, а также есть хорошее обсуждение того, почему вы можете не захотеть этого делать :)

12.04.2011
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..