Как проверить, что param на самом деле Json, а не просто строка

У меня есть JsonNode, который я принимаю в качестве параметра конечной точки. Выглядит примерно так:

@ApiModelProperty(value = "data", example = "{}", required = true)
@NotNull(message = "data cannot be null")
protected JsonNode data;

Я хочу создать валидатор с именем @ValidJson. Сам JsonNode позаботится о том, чтобы передаваемая ему информация была действительной json, поэтому, если я передам что-то вроде:

{"data" = "hello",}, где после "hello" стоит лишняя запятая, выдаст ошибку. Но как мне убедиться, что я не получаю что-то вроде "Hello" для JsonNode, что является допустимым json, поскольку обычная строка является допустимым представлением json?

Сначала я думал проверить, является ли строка просто буквенно-цифровой, и если это так, то я бы посчитал ее недействительной, но тогда, очевидно, кто-то может просто передать строку с символом в ней, и все будет хорошо. Лучшее решение, которое я мог придумать, состояло в том, чтобы проверить, что первый и последний символы равны { и } соответственно, а JsonNode позаботится обо всем остальном. Но я недостаточно знаю о JsonNode, так что, может быть, у кого-нибудь есть идея получше?

Редактировать:

Чтобы быть более конкретным с тем, что я хочу, вот несколько примеров:

JsonNode позаботится о неправильном Json. Я хочу провести более строгую проверку данных, которые я получаю. Я не хочу получать какой-либо своего рода Json, я хочу «настоящий», сериализуемый json, который мы все имеем в виду, когда говорим json . Если пользователь передает строку, которая выглядит так:

"Hello" "Hello world" "I'm just a random String that isn't in a key:value structure"

И т. д., я хочу выдать ошибку и попросить их Json, отформатированный в структуре ключ: значение, например:

{
   "key": "value"
}

Я думал проверить, являются ли первое и последнее строковые значения { и } соответственно, как я упоминал в своих комментариях, но я думаю, что это слишком "хакерски", и, возможно, может быть лучший метод.


person John Lexus    schedule 17.10.2019    source источник
comment
json в качестве параметра запроса кажется довольно неправильным.   -  person RobOhRob    schedule 17.10.2019
comment
Что ты имеешь в виду? Вы должны как-то отправлять данные в сообщение ... довольно стандартно, чтобы иметь json?   -  person John Lexus    schedule 17.10.2019
comment
В любом случае это должно вызвать ошибку, поскольку это недопустимый JSON. Но если вы хотите разрешить только объект JSON, зачем определять его как общий узел?   -  person Dave Newton    schedule 17.10.2019
comment
JsonNode имеет isObject(), а также другие методы проверки, такие как isArray(), isNumeric() и isTextual(). Это то, что вы ищете?   -  person Dioxin    schedule 17.10.2019
comment
@DaveNewton Что не является действительным? Нормальная струна? Это на самом деле   -  person John Lexus    schedule 17.10.2019
comment
@VinceEmigh isObject выглядит многообещающе...   -  person John Lexus    schedule 17.10.2019
comment
@JohnLexus, вы сказали as a param... Я предполагал, что вы говорите о параметре запроса, но теперь я предполагаю, что вы говорите о теле запроса.... Если это так, вы должны создать класс, который представляет этот json , и Spring будет обрабатывать преобразование (и Spring также будет выдавать ошибки, если оно недействительно)   -  person RobOhRob    schedule 17.10.2019
comment
@JohnLexus также "hello" недействителен json... см. json.org   -  person RobOhRob    schedule 17.10.2019
comment
@JohnLexus Показанный вами пример недействителен в формате JSON: вместо двоеточия стоит знак равенства.   -  person Dave Newton    schedule 17.10.2019
comment
@DaveNewton Я нигде не вижу знака равенства.   -  person John Lexus    schedule 17.10.2019
comment
О, ты имеешь в виду тот, где я специально сделал это недействительным, да, это должно было быть там   -  person John Lexus    schedule 17.10.2019
comment
@RobOhRob К вашему сведению .. 1. Spring не обрабатывает преобразование, это Джексон. 2. Hello — это отличный JSON. На самом деле это не Json Object, а JSON.   -  person Joel    schedule 17.10.2019
comment
@JohnLexus Понятно. Думаю, я был сбит с толку, потому что вы прямо сказали, что запятая делает его недействительным.   -  person Dave Newton    schedule 18.10.2019
comment
JSON.. Обозначение объектов JavaScript...????   -  person RobOhRob    schedule 18.10.2019
comment
@VinceEmigh Недавно вернулся к этой истории и, просматривая документы, нашел решение и вспомнил, что это было то, что вы предложили. Вы были полностью правы, отдал вам должное в своем посте. Спасибо, мужик   -  person John Lexus    schedule 24.10.2019
comment
Без проблем. Просто обязательно ознакомьтесь с JavaDocs (или, в некоторых случаях, с спецификацией языка, когда вы issue не включает в себя какие-либо конкретные типы ссылок) в любое время, когда у вас возникает проблема. Вы можете не только быстрее получить решение, но и получить более глубокое представление, которое будет полезно в будущем.   -  person Dioxin    schedule 25.10.2019


Ответы (2)


Джексон предназначен для преобразования JSON в объекты Java. Хотя ваш вариант использования может работать, он, скорее всего, не очень полезен. Взгляните на https://www.baeldung.com/jackson, это руководство может помочь вам понять Джексон и его преобразование в JSON.

Если вы действительно хотите использовать JsonNode, Джексон уже проверит, является ли это правильным JSON, иначе он немедленно выдаст исключение, потому что не может проанализировать его в JsonNode.

Если вам нужен объект JSON, вы можете просто использовать Map<String, Object> вместо JsonNode. Это будет обрабатывать часть ключ-значение.

person Joel    schedule 17.10.2019
comment
Да, но как мне проверить его фактический Json, а не, скажем, просто строку? Если вы передадите Hello JsonNode, он будет работать нормально. - person John Lexus; 17.10.2019
comment
Hello — абсолютно правильная строка JSON. В связи с этим я настоятельно рекомендую вам взглянуть на учебник, чтобы узнать, как на самом деле работает Джексон и как вы можете ожидать JSON, которого вы действительно ожидаете. См. jsonformatter.curiousconcept.com. - person Joel; 17.10.2019
comment
Предложите что-нибудь конкретное? Похоже, ты знаешь что-то, чего не знаю я. Возможно ли, что вы могли бы поделиться им? - person John Lexus; 17.10.2019
comment
Если вы сообщите нам, какие данные вы пытаетесь получить от своего клиента, я буду рад помочь вам. Но если вы не предоставите нам больше информации, я не смогу вам помочь. Вероятно, лучше всего было бы, если бы вы показали нам ожидаемый Json. - person Joel; 17.10.2019
comment
Я добавил правку, дайте мне знать, если это прояснит ситуацию. - person John Lexus; 17.10.2019
comment
Спасибо за ваше редактирование. Но мой фактический вопрос был, если вы ищете конкретные данные JSON. например {название: тест, страна: Франция}? - person Joel; 17.10.2019
comment
Ааа... извините, нет, я не ищу конкретные данные Json. Я ищу только данные json, которые находятся в паре ключ: значение. Вот и все. Это может быть что угодно, если оно допустимо (о чем позаботится JsonNode) и в паре ключ:значение. - person John Lexus; 17.10.2019
comment
Это означает, что моя проверка не будет похожа на утверждение, что узел json data.equalTo({"name": "test", "country":"france"}), а больше похож на {name:test...} json в паре ключ:значение. Так что привет не в том формате, так что это неправильно. - person John Lexus; 17.10.2019

Как отметил @VinceEmigh в комментариях, isObject — это функция, которую я искал.

person John Lexus    schedule 22.10.2019