#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