всем.
У меня есть вопрос об использовании Джексона для анализа строки 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);
}
}
Справка. Пожалуйста.