Парсер Джексона не ошибается с JsonParseException для явно плохого json - PullRequest
0 голосов
/ 09 мая 2019

Я выясняю, почему простая установка десериализации Jackson JSON не работает на моем явно сломанном Json.В моем приложении я ДОЛЖЕН подтвердить, что ввод является действительным json, прежде чем выполнять сопоставление с типом Java.


final String json = "[\"plop\"]]]]]]]]]]]]]]]]";

final ObjectMapper om = new ObjectMapper();

final JsonFactory jf = new JsonFactory();

jf.setCodec(om);

final JsonParser jp = jf.createParser(json);

jp.disable(JsonParser.Feature.ALLOW_TRAILING_COMMA);

jp.readValueAsTree()

(я запускаю это в IntelliJ Evaluate ?)

Вы видите, что мой JSON имеет многосвисающий массив близко] как я выберу.Парсер не заботится о них.

Другой мусор, который, по-видимому, разрешает эта настройка:

final String json = "{}]]]]";
final String json = "[{},[]]]]]]]]";
final String json = "[{},{}]}}}}";

Видите ли, проблема не сводится к висячему] - такая же проблема для}.

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

Есть идеи, кто-нибудь?Буллер?

Рич

1 Ответ

1 голос
/ 09 мая 2019

Вы правы.После десериализации массива (в случае "["blah"]]]" он останавливается и больше ничего не читает, поэтому вы можете поместить что-нибудь после закрытия ].

Подробнее см. ObjectMapper.readTree.

@Override
public <T extends TreeNode> T readTree(JsonParser p)
    throws IOException, JsonProcessingException
{
    /* 02-Mar-2009, tatu: One twist; deserialization provider
     *   will map JSON null straight into Java null. But what
     *   we want to return is the "null node" instead.
     */
    /* 05-Aug-2011, tatu: Also, must check for EOF here before
     *   calling readValue(), since that'll choke on it otherwise
     */
    DeserializationConfig cfg = getDeserializationConfig();
    JsonToken t = p.getCurrentToken();
    if (t == null) {
        t = p.nextToken();
        if (t == null) {
            return null;
        }
    }
    JsonNode n = (JsonNode) _readValue(cfg, p, JSON_NODE_TYPE);
    if (n == null) {
        n = getNodeFactory().nullNode();
    }
    @SuppressWarnings("unchecked")
    T result = (T) n;
    return result;
}
...