Доступ до членів елементів у JSONArray з Java


122

Я тільки починаю використовувати json з Java. Я не впевнений, як отримати доступ до рядкових значень у JSONArray. Наприклад, мій json виглядає так:

{
  "locations": {
    "record": [
      {
        "id": 8817,
        "loc": "NEW YORK CITY"
      },
      {
        "id": 2873,
        "loc": "UNITED STATES"
      },
      {
        "id": 1501
        "loc": "NEW YORK STATE"
      }
    ]
  }
}

мій код:

JSONObject req = new JSONObject(join(loadStrings(data.json),""));
JSONObject locs = req.getJSONObject("locations");
JSONArray recs = locs.getJSONArray("record");

У мене зараз доступ до "запису" JSONArray, але я не впевнений, як я отримаю значення "id" та "loc" в циклі for. Вибачте, якщо цей опис не надто зрозумілий, я трохи новачок у програмуванні.


2
Інша річ (ймовірно, ви її знайшли) - ви пропустили кому після третього значення id. Добре завжди використовувати якийсь парсер, наприклад json.parser.online.fr
Krystian

Відповіді:


218

Ви спробували використовувати JSONArray.getJSONObject (int) та JSONArray.length () для створення свого for-loop:

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}

Я цього не розумію. Якщо ми можемо отримати idз симплетом, getIntяк, як ми отримуємо значення хешмапу, вказавши ключ, то чому ми повинні перебирати цикл for? Чи не ітерація з циклом примушує idприсвоювати int idкілька разів?
Nav

Для більш складних JSON знайшов це приємне рішення за прикладами.javacodegeeks.com
core-java/json

як я можу це зробити для php?
Хані Асемі

Як це буде працювати, якщо я знаю ідентифікатор, але мені потрібна відповідна локація?
ToofanHasAririred

6

Org.json.JSONArray НЕ ітерацію.
Ось як я обробляю елементи в net.sf.json.JSONArray :

    JSONArray lineItems = jsonObject.getJSONArray("lineItems");
    for (Object o : lineItems) {
        JSONObject jsonLineItem = (JSONObject) o;
        String key = jsonLineItem.getString("key");
        String value = jsonLineItem.getString("value");
        ...
    }

Чудово працює ... :)


10
Це не працює для мене, оскільки JSONArrayце не можна піддати.
michel404

8
org.json.JSONArray - не ітерабельний, але net.sf.json.JSONArray є ітерабельним
травня

ваше посилання порушено
VdeX

4

Java 8 з'являється на ринку майже через два десятиліття, наступний спосіб ітерації org.json.JSONArrayз API Java Stream.

import org.json.JSONArray;
import org.json.JSONObject;

@Test
public void access_org_JsonArray() {
    //Given: array
    JSONArray jsonArray = new JSONArray(Arrays.asList(new JSONObject(
                    new HashMap() {{
                        put("a", 100);
                        put("b", 200);
                    }}
            ),
            new JSONObject(
                    new HashMap() {{
                        put("a", 300);
                        put("b", 400);
                    }}
            )));

    //Then: convert to List<JSONObject>
    List<JSONObject> jsonItems = IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .collect(Collectors.toList());

    // you can access the array elements now
    jsonItems.forEach(arrayElement -> System.out.println(arrayElement.get("a")));
    // prints 100, 300
}

Якщо ітерація лише один раз, (не потрібно .collect)

    IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .forEach(item -> {
               System.out.println(item);
            });

1
.mapToObjпоказує "необроблений виняток: JSONException"
Андрейс

1
у синтаксисі .mapToObj(index -> (JSONObject) array.get(index)), терези, jsonArray.get(index)які потенційно можуть кинути, JSONExceptionале JSONException extends RuntimeExceptionтак, слід штрафувати хоча б під час компіляції
prayagupd

2

Переглядаючи ваш код, я розумію, що ви використовуєте JSONLIB. Якщо це було так, подивіться на наступний фрагмент для перетворення масиву json в масив java ..

 JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( input );  
 JsonConfig jsonConfig = new JsonConfig();  
 jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );  
 jsonConfig.setRootClass( Integer.TYPE );  
 int[] output = (int[]) JSONSerializer.toJava( jsonArray, jsonConfig );  

0

Якщо це допомагає комусь іншому, я зміг перетворитись на масив, зробивши щось подібне,

JSONObject jsonObject = (JSONObject)new JSONParser().parse(jsonString);
((JSONArray) jsonObject).toArray()

... або ви повинні мати можливість отримати довжину

((JSONArray) myJsonArray).toArray().length

org.json.JSONObjectмає toJSONArray(JSONArray names)метод і org.json.JSONArrayмає toJSONObject(JSONArray names)метод, але він не має toArray()методу.
BrionS

-1

HashMap regs = (HashMap) parser.parse (stringjson);

(String) (( HashMap ) regs.get ("firstlevelkey")). Get ("secondlevelkey");


1
Трохи більше роз’яснень, чому ваша відповідь краще, ніж поточна прийнята допоможе зрозуміти ваше рішення.
Вадимо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.