Как мне разобрать внутренний массив из строки json? - PullRequest
2 голосов
/ 14 декабря 2009
{"genres":[{"total_genres":"2"},{"genre":[{"code":"CTY","name":"Country"}]},{"genre":[{"code":"HOP","name":"Hip Hop / R&B"}]}]}

Я пытаюсь разобрать внутренний массив "жанр" из этой строки. Я могу получить внешний массив "жанров", если я сделаю:

JSONObject outer=new JSONObject(returnContent);

JSONArray ja = outer.getJSONArray ("genres");

Как извлечь внутренние объекты?

1 Ответ

3 голосов
/ 14 декабря 2009

Вам придется перебирать массив. Предположим, JSONArray для ежевики работает как Java-эквивалент (или это Java?):

for(int i = 0; i < ja.size(); i++) {
    JSONObject inner = ja.get(i);
}

Что касается самого JSON, я бы сказал, что можно ожидать, что «жанры» будут множеством жанров. Теперь это массив жанров + объект, содержащий количество жанров. Это сработает, и я думаю, что в какой-то момент прелесть JSON в том, что вы можете делать с ним все, что хотите, но это довольно непредсказуемо, и вам придется изменить свой код, чтобы приспособить его. Например, в моем примере выше вы должны начинать не с i = 0, а с i = 1, чтобы перейти непосредственно к реальным жанрам. Но я бы предпочел изменить JSON следующим образом:

{"total_genres":"2", "genres":[{"genre":[{"code":"CTY","name":"Country"}]},{"genre":[{"code":"HOP","name":"Hip Hop / R&B"}]}]}

Теперь рассмотрим ваши отдельные жанры. «Жанры» - это массив объектов. Каждый объект имеет только одно свойство «жанр», которое само по себе содержит массив. Каждый массив содержит только один элемент, который является объектом, содержащим код и имя. Это кажется мне избыточной упаковкой. Чтобы извлечь код и имя, вам нужно сделать что-то вроде этого:

for(int i = 1; i < ja.size(); i++) {
    JSONObject inner = ja.get(i);
    JSONArray innerArray = inner.getJSONArray("genre");
    JSONObject evenFurtherInner = innerArray.get(0);

    String code = evenFurtherInner.getString("code");
}

Но я бы предпочел не использовать этот подход вообще. Было бы намного чище, если бы вы могли изменить свой JSON следующим образом:

{"total_genres":"2", "genres":[{"code":"CTY","name":"Country"},{"code":"HOP","name":"Hip Hop / R&B"}]}

Тогда вы могли бы сделать

for(int i = 0; i < ja.size(); i++) {
    JSONObject genre = ja.get(i);
    String code = genre.getString("code");
}

Обратите внимание на использование ja.size(). Поскольку все ваши жанры находятся в массиве, вы можете просто проверить размер массива, а не добавлять дополнительный счетчик в возвращаемый код. Таким образом, вы можете еще больше уменьшить JSON для лучшей читабельности:

{"genres":[{"code":"CTY","name":"Country"},{"code":"HOP","name":"Hip Hop / R&B"}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...