Анализ JSON-объекта в Java
У меня есть объект JSON следующим образом:
member = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";
В Java я хочу проанализировать вышеупомянутый jsonobject и сохранить значения в arraylist.
Может ли кто-нибудь предоставить мне некоторый фрагмент кода, через который я смогу достичь этого.
Спасибо
Ответы
Ответ 1
Я предполагаю, что вы хотите сохранить интерес в списке.
Используя библиотеку org.json:
JSONObject obj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");
List<String> list = new ArrayList<String>();
JSONArray array = obj.getJSONArray("interests");
for(int i = 0 ; i < array.length() ; i++){
list.add(array.getJSONObject(i).getString("interestKey"));
}
Ответ 2
public class JsonParsing {
public static Properties properties = null;
public static JSONObject jsonObject = null;
static {
properties = new Properties();
}
public static void main(String[] args) {
try {
JSONParser jsonParser = new JSONParser();
File file = new File("src/main/java/read.json");
Object object = jsonParser.parse(new FileReader(file));
jsonObject = (JSONObject) object;
parseJson(jsonObject);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void getArray(Object object2) throws ParseException {
JSONArray jsonArr = (JSONArray) object2;
for (int k = 0; k < jsonArr.size(); k++) {
if (jsonArr.get(k) instanceof JSONObject) {
parseJson((JSONObject) jsonArr.get(k));
} else {
System.out.println(jsonArr.get(k));
}
}
}
public static void parseJson(JSONObject jsonObject) throws ParseException {
Set<Object> set = jsonObject.keySet();
Iterator<Object> iterator = set.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
if (jsonObject.get(obj) instanceof JSONArray) {
System.out.println(obj.toString());
getArray(jsonObject.get(obj));
} else {
if (jsonObject.get(obj) instanceof JSONObject) {
parseJson((JSONObject) jsonObject.get(obj));
} else {
System.out.println(obj.toString() + "\t"
+ jsonObject.get(obj));
}
}
}
}}
Ответ 3
Большое спасибо soooooooo к CODE
Я могу прочитать любой файл JSON благодаря вашему коду:)
Теперь я пытаюсь организовать все элементы по уровням, потому что мог бы их использовать!
Я работал с Android, читающим JSON по URL-адресу, и мне нужно было изменить только строки
Set<Object> set = jsonObject.keySet();
Iterator<Object> iterator = set.iterator();
для
Iterator<?> iterator = jsonObject.keys();
Я поделился своей реализацией, чтобы помочь кому-то:
public void parseJson(JSONObject jsonObject) throws ParseException, JSONException {
Iterator<?> iterator = jsonObject.keys();
while (iterator.hasNext()) {
String obj = iterator.next().toString();
if (jsonObject.get(obj) instanceof JSONArray) {
//Toast.makeText(MainActivity.this, "Objeto: JSONArray", Toast.LENGTH_SHORT).show();
//System.out.println(obj.toString());
TextView txtView = new TextView(this);
txtView.setText(obj.toString());
layoutIzq.addView(txtView);
getArray(jsonObject.get(obj));
} else {
if (jsonObject.get(obj) instanceof JSONObject) {
//Toast.makeText(MainActivity.this, "Objeto: JSONObject", Toast.LENGTH_SHORT).show();
parseJson((JSONObject) jsonObject.get(obj));
} else {
//Toast.makeText(MainActivity.this, "Objeto: Value", Toast.LENGTH_SHORT).show();
//System.out.println(obj.toString() + "\t"+ jsonObject.get(obj));
TextView txtView = new TextView(this);
txtView.setText(obj.toString() + "\t"+ jsonObject.get(obj));
layoutIzq.addView(txtView);
}
}
}
}
Ответ 4
В Java доступно много JSON-библиотек.
Самые известные из них: Джексон, GSON, Genson, FastJson и org.json.
Обычно для выбора любой библиотеки нужно искать три вещи:
- Производительность
- Простота использования (код прост в написании и разборчивости) - это относится к функциям.
- Для мобильных приложений: зависимость/размер jar
В частности, для библиотек JSON (и любых сериализационных/десериализационных библиотек) также интересна привязка данных, поскольку она устраняет необходимость написания кода котельной пластины для упаковки/распаковки данных.
Для 1 см. этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH, который сравнивает (джексон, gson, genson, fastjson, org.json, jsonp) производительность сериализаторов и десериализаторов с использованием API потоков и данных.
Для 2 вы можете найти множество примеров в Интернете. Вышеупомянутый эталон также может быть использован в качестве источника примеров...
Быстрый вынос теста: Джексон выполняет в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чем GSON.
В вашем конкретном примере следующий код расшифровывает ваш json с помощью jackson:
public class MyObj {
private List<Interest> interests;
static final class Interest {
private String interestKey;
}
private static final ObjectMapper MAPPER = new ObjectMapper();
public static void main(String[] args) throws IOException {
MyObj o = JACKSON.readValue("{\"interests\": [{\"interestKey\": \"Dogs\"}, {\"interestKey\": \"Cats\" }]}", MyObj.class);
}
}
Сообщите мне, если у вас есть какие-либо вопросы.
Ответ 5
1.) Создайте arraylist соответствующего типа, в этом случае i.e String
2.) Создайте JSONObject
, передавая строку в конструктор JSONObject
в качестве входного
- В качестве
JSONObject
обозначение представлено фигурными скобками i.e {}
- Где в качестве обозначения
JSONArray
представлены квадратные скобки i.e []
3.) Извлеките JSONArray
из JSONObject
(созданный на 2-м шаге), используя "interests"
в качестве индекса.
4.) Траверс JASONArray
с использованием циклов до длины массива, предоставляемых функцией length()
5.) Извлеките JSONObjects
из JSONArray
с помощью функции getJSONObject(index)
6.) Извлеките данные из JSONObject
, используя индекс "InterestKey".
Примечание: JSON
синтаксический анализ использует escape-последовательность для специальных вложенных символов, если ответ json (обычно из других API-интерфейсов JSON) содержит кавычки ("
) как это
`"{"key":"value"}"`
должен быть таким
`"{\"key\":\"value\"}"`
чтобы вы могли использовать JSONParser
для получения формата экранированной последовательности для безопасности, как
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(inputString);
Код:
JSONParser parser = new JSONParser();
String response = "{interests : [{interestKey:Dogs}, {interestKey:Cats}]}";
JSONObject jsonObj = (JSONObject) parser.parse(response);
или
JSONObject jsonObj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");
List<String> interestList = new ArrayList<String>();
JSONArray jsonArray = jsonObj.getJSONArray("interests");
for(int i = 0 ; i < jsonArray.length() ; i++){
interestList.add(jsonArray.getJSONObject(i).optString("interestKey"));
}
Примечание. Иногда вы можете видеть некоторые исключения, если values are not available in appropriate type or is there is no mapping key
поэтому в тех случаях, когда вы не уверены в наличии значения, используйте optString
, optInt
, optBoolean
и т.д., который просто вернет значение по умолчанию, если оно отсутствует, и даже попытается преобразовать значение в int, если оно имеет тип строки, и наоборот. Просто Нет исключений null или NumberFormat вообще в случае отсутствующий ключ или значение
Из документов
Получить необязательную строку, связанную с ключом. Он возвращает defaultValue, если такой ключ отсутствует.
public String optString(String key, String defaultValue) {
String missingKeyValue = json_data.optString("status","N/A");
// note there is no such key as "status" in response
// will return "N/A" if no key found
или Чтобы получить пустую строку i.e ""
, если ключ не найден, просто используйте
String missingKeyValue = json_data.optString("status");
// will return "" if no key found where "" is an empty string
Дополнительная ссылка на исследование