Разобрать json, используя ObjectMapper, где ключ json содержит значение json - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть класс с такой структурой:

class SomeClass {

        private String stringValue; 
        private Collection<String> collectionValue = new ArrayList<>();
        private String jsonStringValue;
        private boolean booleanValue;
}

И затем я использую

objectMapper.readValue(jsonString, SomeClass.class);

для анализа этого объекта из JSON.

Основная проблема заключается вчто jsonStringValue является json внутри json:

{"stringValue" : "someString",
 "collectionValue" : ["123456", "234567", "hello"],
 "jsonStringValue" : "{
    "someKey" : 1,
    "anotherKey" : {
      "againKey" : "value"
     }
  },
  "booleanValue" : true
}

И, пытаясь проанализировать jsonStringValue, он выбрасывает

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('a' (code 97)): was expecting comma to separate Object entries

Точно символ "a" из моего примера (json изменен в целях безопасности)

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

Как мне проанализировать значение json как строку?

1 Ответ

1 голос
/ 01 октября 2019

Во-первых, ваша строка JSON не является действительной , поскольку перед левой скобкой в ​​jsonStringValue стоит лишняя двойная кавычка. Действительный выглядит так:

{
  "stringValue" : "someString",
  "collectionValue" : ["123456", "234567", "hello"],
  "jsonStringValue" : {
    "someKey" : 1,
    "anotherKey" : {
      "againKey" : "value"
    }
  },
  "booleanValue" : true
}

Во-вторых, jsonStringValue - это не простой объект String, это вложенные объекты JSON. Следовательно, вы должны создать соответствующие классы для него следующим образом:

Class SomeClass {
    private String stringValue; 
    private List<String> collectionValue = new ArrayList<>();
    private JsonStringValue jsonStringValue;
    private boolean booleanValue;

    //general getters and setters
}

Class JsonStringValue  {
    private int someKey;
    private AnotherKey anotherKey;

    //general getters and setters
}

Class AnotherKey {
    private String againKey;

    //general getters and setters
}

Наконец, данную строку JSON можно преобразовать в SomeClass POJO с помощью ObjectMapper.

ObjectMapper mapper = new ObjectMapper();
SomeClass someClass = mapper.readValue(jsonStr, SomeClass.class);
System.out.println(someClass.getjsonStringValue().getAnotherKey().getAgainKey());

Вывод на консоль:

значение

ОБНОВЛЕНО

Если вы все еще хотите преобразовать объект jsonStringValue в String, альтернативный способ показан следующим образом:

Создайте 2 класса - SomeClassOriginal и SomeClass, единственная разница между ними - тип данных jsonStringValue. Первый - JsonNode, а позже - String.

Class SomeClassOriginal {
    private String stringValue; 
    private List<String> collectionValue = new ArrayList<>();
    private JsonNode jsonStringValue;
    private boolean booleanValue;

    //general getters and setters
}

Class SomeClass {
    private String stringValue; 
    private List<String> collectionValue = new ArrayList<>();
    private String jsonStringValue;
    private boolean booleanValue;

    public SomeClass(SomeClassOriginal someClassOriginal) {
        super();
        this.stringValue = someClassOriginal.stringValue;
        this.collectionValue = someClassOriginal.collectionValue ;
        this.jsonStringValue= someClassOriginal.jsonStringValue.toString();
        this.booleanValue= someClassOriginal.booleanValue;
    }

    //general getters and setters
}

Тогда вы можете получить jsonStringValue как String, например:

ObjectMapper mapper = new ObjectMapper();
SomeClassOriginal someClassOriginal = mapper.readValue(jsonStr, SomeClassOriginal.class);
SomeClass someClass = new SomeClass(SomeClassOriginal);
System.out.println(someClass.getjsonStringValue());

Вывод на консоль:

{"someKey": 1, "anotherKey": {"againKey": "value"}}

...