Java не удалось проанализировать вложенный объект json

#java #json #jsonparser

#java #json #jsonparser

Вопрос:

Ниже приведен пример кода:

 import org.json.JSONObject;

String k = "{"root1":"{\"key1\":\"val1\",\"key2\":1,\"key3\":null}","root2":"OTHERS","root3":1}";
JSONObject obj = new JSONObject(str);
System.out.println(obj);

/* 
here I want to do something like:
JSONObject innerObj = (JSONObject) obj.get("root1");
String k1 = innerObj.get("key1");

Also, should work with nested inner objects, so for example, should be able to do:
String k4 = innerObj.get("key1.innerKey1");
*/
  
 {"root1":"{"key1":"val1","key2":1,"key3":null}","root2":"OTHERS","root3":1}
  

При выполнении JSONObject innerObj = (JSONObject) obj.get(«root1»); — это дает:

Исключение в потоке «main» java.lang.ClassCastException: java.lang.Строка не может быть передана в org.json.JSONObject

Я пробовал Gson, JsonParser — но все равно не смог этого сделать…

Примечание: синтаксический анализ строки ‘k’ работает нормально, так как объект заполнен правильно и распечатан. При попытке получить доступ к объектам внутри этого объекта происходит сбой: JSONObject innerObj = (JSONObject) obj.get(«root1»);

Комментарии:

1. root1 Ключ сопоставляется со строкой. Это то, что " кавычки делают внутри вашего JSON. Похоже, ваш JSON был составлен неправильно.

2. Ваше root1 свойство не является объектом JSON; это строка, значение которой равно JSON , корневым значением которой является объект JSON. Исправьте сборку, если это вообще возможно; если нет, вам нужно будет извлечь строку и выполнить ее синтаксический анализ во второй раз.

3. @chrylis -осторожно оптимистично — — как это сделать? я использую import org.json.JSONObject;

Ответ №1:

В текстовой библиотеке apache commons есть служебный класс StringEscapeUtils для таких переводов. Его применение приведет к удалению этих дополнительных двойных кавычек вокруг root1 значения.

Добавьте эту зависимость от commons-text jar в свой проект.

Использование —

 String k = "{"root1":"{\"key1\":\"val1\",\"key2\":1,\"key3\":null}","root2":"OTHERS","root3":1}";

// add this line
String unescapedJsonString = StringEscapeUtils.unescapeJson(k);

 // pass new json string to Json library
JSONObject obj = new JSONObject(unescapedJsonString);
  

Ответ №2:

Пожалуйста, проверьте это-

 public static void main(String[] args) {

    String k ="{"root1":{"key1":"val1","key2":1,"key3":null},"root2":"OTHERS","root3":1}";
    JSONObject obj = new JSONObject(k);
    System.out.println(obj);
     
    //here I want to do something like:
    JSONObject innerObj = (JSONObject) obj.get("root1");
    Object k1 =  innerObj.get("key1");
    System.out.println(k1);
    Object k2 =  innerObj.get("key2");
    System.out.println(k2);
    Object k3 =  innerObj.get("key3");
    System.out.println(k3);
    
    System.out.println(obj.get("root2"));
    System.out.println(obj.get("root3"));
}
  

Вывод —

 {"root1":{"key1":"val1","key2":1,"key3":null},"root2":"OTHERS","root3":1}
val1
1
null
OTHERS
1
  

Комментарии:

1. не уверен, кто проголосовал за это… я сделал аналогичную вещь в своем реальном коде, но когда я обращаюсь к внутреннему элементу, а затем печатаю его, он выдает что-то вроде: « JSONObject innerObj = (JSONObject) obj.get(«root1»); logger.debug(«внутренний объект: » innerObj.toString()); «внутренний объект: {«байты»: [123,34,101],»пустой»: false}

2. и моя проблема заключается в том, как указано @chrylis -cautiouslyoptimistic- выше: «Ваше свойство root1 не является объектом JSON; это строка, значение которой равно JSON, корневое значение которой является объектом JSON. Исправьте сборку, если это вообще возможно; если нет, вам нужно будет извлечь строку и выполнить ее синтаксический анализ во второй раз.’да, поэтому значение моего root1 — это строка с jsonObj, а не jsonObj