Как использовать Джексона для разбора строки JSON с обратной косой чертой - PullRequest
0 голосов
/ 30 апреля 2020

всем.

У меня есть вопрос об использовании Джексона для анализа строки json с обратными слешами. Когда я пытаюсь выполнить синтаксический анализ, число обратных косых черт всегда неверно.

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

Когда я используйте String для определения json строкового объекта. Если я хочу использовать обратную косую черту sh, после того как Джексон анализирует строку json в объект и анализирует ее в строку, обратная черта sh исчезает. Если мне нужны две обратные косые черты, есть только одна обратная косая черта sh.

Однако, когда я использую NeedObject # setId () для установки значения идентификатора, его можно анализировать любое количество раз. Backsla sh всегда существует.

Результат выглядит так:

-------  2 -> 1 -------
source: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
-------  4 -> 2 -------
source: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
-------  6 -> 3 -------
source: [{"needObject":{"id":"AAA\\\\\\BBB\\\\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\\\\\BBB\\\\\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\\\\\BBB\\\\\\CCC"}}]
-------  8 -> 4 -------
source: [{"needObject":{"id":"AAA\\\\\\\\BBB\\\\\\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\\\\\\\BBB\\\\\\\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\\\\\\\BBB\\\\\\\\CCC"}}]
-------  10 -> 5 -------
source: [{"needObject":{"id":"AAA\\\\\\\\\\BBB\\\\\\\\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\\\\\\\\\BBB\\\\\\\\\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\\\\\\\\\BBB\\\\\\\\\\CCC"}}]
------- 2 -> 1 -------
source: [{"needObject":{"id":"AAA\BBB\CCC"}}]
   1.1: [{"needObject":{"id":"AAABBBCCC"}}]
   1.2: [{"needObject":{"id":"AAABBBCCC"}}]
------- 4 -> 2 -------
source: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
------- 6 -> 3 -------
source: [{"needObject":{"id":"AAA\\\BBB\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\BBB\\CCC"}}]
------- 8 -> 4 -------
source: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
------- 10 -> 5 -------
source: [{"needObject":{"id":"AAA\\\\\BBB\\\\\CCC"}}]
   1.1: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]
   1.2: [{"needObject":{"id":"AAA\\\\BBB\\\\CCC"}}]

Код выглядит так:

public class Info {

    private NeedObject needObject;

    public NeedObject getNeedObject() {
        return needObject;
    }

    public Info setNeedObject(NeedObject needObject) {
        this.needObject = needObject;
        return this;
    }

}

public class NeedObject {

    private String id;

    public String getId() {
        return id;
    }

    public NeedObject setId(String id) {
        this.id = id;
        return this;
    }

}

@Test
public void testBackslashWithJsonUtilsToObject() {
    System.out.println("------- 2 -> 1 -------");
    parseJsonString(buildJsonForInfo("AAA\\BBB\\CCC"));// 2 -> 1
    System.out.println("------- 4 -> 2 -------");
    parseJsonString(buildJsonForInfo("AAA\\\\BBB\\\\CCC"));// 4 -> 2
    System.out.println("------- 6 -> 3 -------");
    parseJsonString(buildJsonForInfo("AAA\\\\\\BBB\\\\\\CCC"));// 6 -> 3
    System.out.println("------- 8 -> 4 -------");
    parseJsonString(buildJsonForInfo("AAA\\\\\\\\BBB\\\\\\\\CCC")); // 8 -> 4
    System.out.println("------- 10 -> 5 -------");
    parseJsonString(buildJsonForInfo("AAA\\\\\\\\\\BBB\\\\\\\\\\CCC")); // 10 -> 5

    System.out.println("------- 2 -> 1 -------");
    parseJsonString("[{\"needObject\":{\"id\":\"AAA\\BBB\\CCC\"}}]"); // 2 -> 1
    System.out.println("------- 4 -> 2 -------");
    parseJsonString("[{\"needObject\":{\"id\":\"AAA\\\\BBB\\\\CCC\"}}]");// 4 -> 2
    System.out.println("------- 6 -> 3 -------");
    parseJsonString("[{\"needObject\":{\"id\":\"AAA\\\\\\BBB\\\\\\CCC\"}}]"); // 6 -> 3
    System.out.println("------- 8 -> 4 -------");
    parseJsonString("[{\"needObject\":{\"id\":\"AAA\\\\\\\\BBB\\\\\\\\CCC\"}}]"); // 8 -> 4
    System.out.println("------- 10 -> 5 -------");
    parseJsonString("[{\"needObject\":{\"id\":\"AAA\\\\\\\\\\BBB\\\\\\\\\\CCC\"}}]");// 10 -> 5
}

private void parseJsonString(String jsonInString) {
    System.out.println("source: " + jsonInString);

    toListAndToJson("   1.1: ", jsonInString);
    toListAndToJson("   1.2: ", jsonInString);
}

private String toListAndToJson(String sequence, String jsonInString) {
    List<Info> Infos = JsonUtils.toList(jsonInString, Info.class);

    jsonInString = JsonUtils.toString(Infos);
    System.out.println(sequence + jsonInString);

    return jsonInString;
}

private String buildJsonForInfo(String id) {
    List<Info> infos = new ArrayList<>();

    infos.add(new Info().setNeedObject(new NeedObject().setId(id)));

    return JsonUtils.toString(infos);
}

Конфигурация Джексона выглядит следующим образом:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

JsonUtils выглядит так:

public static <T> List<T> toList(String jsonInString, Class<T> valueType, ObjectMapper om) {
    try {
        JavaType javaType = om.getTypeFactory().constructParametricType(ArrayList.class, valueType);
        return om.readValue(jsonInString, javaType);
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

public static <T> List<T> toList(String jsonInString, Class<T> valueType) {
    return toList(jsonInString, valueType, defaultObjectMapper);
}

public static String toString(Object jsonOutObj) {
    return toString(jsonOutObj, defaultObjectMapper);
}

public static String toString(Object jsonOutObj, ObjectMapper om) {
    try {
        return om.writeValueAsString(jsonOutObj);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

Справка. Пожалуйста.

...