Расшифровка строки JSON в Java
Я новичок в использовании библиотеки json-simple в Java и прошел через примеры кодирования и декодирования. Дублировать примеры кодирования было хорошо, но я не смог заставить декодировать работу со смешанным типом JSON.
Одна из моих проблем заключается в том, что в библиотеке слишком много классов, которые не документированы надлежащим образом и для которых у меня нет источника (чтобы я мог прочитать и понять их назначение). Следовательно, я изо всех сил пытаюсь понять, как использовать много этих классов.
Прочитав этот пример:
String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
JSONParser parser = new JSONParser();
ContainerFactory containerFactory = new ContainerFactory(){
public List creatArrayContainer() {
return new LinkedList();
}
public Map createObjectContainer() {
return new LinkedHashMap();
}
};
try {
Map json = (Map)parser.parse(jsonText, containerFactory);
Iterator iter = json.entrySet().iterator();
System.out.println("==iterate result==");
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
System.out.println(entry.getKey() + "=>" + entry.getValue());
}
System.out.println("==toJSONString()==");
System.out.println(JSONValue.toJSONString(json));
} catch(ParseException pe) {
System.out.println(pe);
}
из официального руководства по декодированию json-simple я попытался расшифровать этот JSON:
{
"stat":{
"sdr": "MAC address of FLYPORT",
"rcv": "ff:ff:ff:ff:ff:ff",
"time": "0000000000000",
"type": 0,
"subt": 0,
"argv": [
{"type": "6","val": "NetbiosName"},
{"type": "6","val": "MACaddrFlyport"},
{"type": "6","val": "FlyportModel"},
{"type": "1","val": id}
]
}
}
Я пишу следующий код для декодирования:
String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{1,2},{2,3}]}}";
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject newJSON = jsonObject.getJSONObject("stat");
System.out.println(newJSON);
Но это не работает. Фактически я не смог заставить работать немодифицированный пример, и авторы оригинала не объяснили их код.
Какой самый простой способ декодировать этот JSON, как показано?
4 ответа
Это лучший и самый простой код:
public class test
{
public static void main(String str[])
{
String jsonString = "{\"stat\": { \"sdr\": \"aa:bb:cc:dd:ee:ff\", \"rcv\": \"aa:bb:cc:dd:ee:ff\", \"time\": \"UTC in millis\", \"type\": 1, \"subt\": 1, \"argv\": [{\"type\": 1, \"val\":\"stackru\"}]}}";
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject newJSON = jsonObject.getJSONObject("stat");
System.out.println(newJSON.toString());
jsonObject = new JSONObject(newJSON.toString());
System.out.println(jsonObject.getString("rcv"));
System.out.println(jsonObject.getJSONArray("argv"));
}
}
Определение библиотеки файлов json приведено здесь. И это не те библиотеки, что выложены здесь, т.е. размещены вами. То, что вы опубликовали, было простой библиотекой JSON. Я использовал эту библиотеку.
Вы можете скачать почтовый индекс. А затем создать package
в вашем проекте с именем org.json. и вставьте туда все скачанные коды, и получайте удовольствие.
Я считаю, что это лучшее и самое простое декодирование JSON.
Ну, ваша JSONString не так.
String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{\"1\":2},{\"2\":3}]}}";
использовать этот jsonString
и если вы используете то же самое JSONParser
а также ContainerFactory
в примере вы увидите, что он будет закодирован / декодирован.
Кроме того, если вы хотите напечатать вашу строку после stat
здесь это идет:
try{
Map json = (Map)parser.parse(jsonString, containerFactory);
Iterator iter = json.entrySet().iterator();
System.out.println("==iterate result==");
Object entry = json.get("stat");
System.out.println(entry);
}
А о библиотеках json их много. Лучше ты это проверь.
Это строка JSON, которую мы хотим декодировать:
{
"stats": {
"sdr": "aa:bb:cc:dd:ee:ff",
"rcv": "aa:bb:cc:dd:ee:ff",
"time": "UTC in millis",
"type": 1,
"subt": 1,
"argv": [
{"1": 2},
{"2": 3}
]}
}
Я храню эту строку под именем переменной "sJSON". Теперь, как ее декодировать:)
// Creating a JSONObject from a String
JSONObject nodeRoot = new JSONObject(sJSON);
// Creating a sub-JSONObject from another JSONObject
JSONObject nodeStats = nodeRoot.getJSONObject("stats");
// Getting the value of a attribute in a JSONObject
String sSDR = nodeStats.getString("sdr");
Вместо того, чтобы скачивать отдельные java-файлы, как предлагает Veer, вы можете просто добавить этот JAR-файл в ваш пакет.
Чтобы добавить файл JAR в свой проект в Eclipse, выполните следующие действия:
- Щелкните правой кнопкой мыши по своему проекту, выберите "Путь сборки"> "Настроить путь сборки".
- Перейти на вкладку "Библиотеки"> Добавить внешние JAR-файлы
- Найдите файл JAR и добавьте