2013-05-31 4 views
0

У меня есть строка в json формате, и я хочу извлечь определенные значения из этого json. Например:извлечь значение из json string в java

{"foo":"this is foo", "bar":{"nested_bar": "this is nested bar"} } 

пользователь может понадобиться напечатать либо foo или bar или обоих.

Прямо сейчас, у меня есть простой класс, который может читать только плоский json.

Как изменить следующий код, чтобы включить вложенный json?

Другой вопрос - что такое хороший способ представить теги, которые я хочу извлечь, как в плоском json? Я проходил массив.

public class JsonParser { 

public static String[] tagsToExtract; 



public JsonParser(String[] tags){ 
    tagsToExtract = tags; 
} 


public HashMap<String, Object> extractInformation(Text line) throws JSONException{ 
    HashMap<String, Object> outputHash = new HashMap<String, Object>(); 
    JSONObject jsn = new JSONObject(line.toString()); 
    for (int i =0; i < tagsToExtract.length; i++){ 
     outputHash.put(tagsToExtract[i],jsn.get(tagsToExtract[i].toString())); 
    } 
    return outputHash; 

} 

} 
+5

Рассматривали ли вы использование библиотеки разбора JSON, такой как, например, Джексон? – fge

+2

Да, если вы перейдете на json.org, в нем перечислены десятки парсеров JSON для Java. –

ответ

1

Существует немало библиотек JSON для Java, которые будут выполнять именно то, что вы хотите. Несколько более высоко ценится из них являются:

И вы можете найти более глубокое обсуждение различных вариантов здесь: https://stackoverflow.com/questions/338586/a-better-java-json-library

Если вы действительно заинтересованы в написании своего собственного синтаксического анализатора, тем не менее, намек, который я дам, - это воспользоваться рекурсией. Предположим, у вас есть объект JSON-то вроде этого:

{ 
    prop1: (some value), 
    prop2: (some value), 
    ... 
} 

Обратите внимание, что при запуске синтаксического анализа объекта верхнего уровня, вы делаете точно то же самое, что вы будете делать, когда вы разбираете каждое значение - потому что сами значения могут быть просто еще одним объектом JSON. Таким образом, простой способ начать работу - написать парсер, который просто получает ключи и связанные с ними значения в виде строк, без обработки значений. Затем снова вызовите тот же алгоритм для каждого значения - и так далее, пока не получите значение, равное простому значению - строку, число и т. Д.

Смежные вопросы