Как разобрать массив JSON (не объект Json) в Android


90

Мне сложно найти способ разобрать JSONArray. Выглядит это так:

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

Я знаю, как его разобрать, если JSON был написан по-другому (другими словами, если бы мне вернули объект json вместо массива объектов). Но это все, что у меня есть, и я должен с этим смириться.

* РЕДАКТИРОВАТЬ: это действительный файл json. Я сделал приложение для iPhone, используя этот json, теперь мне нужно сделать это для Android, и я не могу понять. Примеров много, но все они связаны с JSONObject. Мне нужно что-то для JSONArray.

Может кто-нибудь дать мне какой-нибудь намек, учебник или пример?

Очень признателен !


1
Попробуйте это, чтобы узнать, действителен ли ваш json json.parser.online.fr
An-droid,

вы используете какую-нибудь библиотеку для разбора json? Используйте библиотеку gson для разбора json.
nilkash

Это действительно так. Я проанализировал его в приложении для iPhone, и оно работает. Я просто не знаю, как это сделать на Android
SteBra

1
@nikash, да, я заметил, что могу использовать gson. единственная проблема в том, что все примеры, которые я нашел, предназначены для разбора JSONObject, а не JSONArray
SteBra

Разместите свой код, который вы пробовали до сих пор, будет полезно дать точный ответ соответственно.
Spring Breaker

Ответы:


147

используйте следующий фрагмент для анализа JsonArray.

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

Надеюсь, поможет.


только один вопрос, если jsonarray включает числа вроде [2]. [4] и эти числа внутри снова включают в себя массив, поэтому, если я хочу извлечь, особенно, скажем, массив, вложенный в numeric [4] в java-коде, я должен написать int i = 4 ???
BiggDawgg

@BiggDawgg: Рад, что помог тебе. Опубликуйте свой вопрос в отдельной ветке с данными JSON, чтобы мне было легко ответить.
Spring Breaker

26

Я просто приведу небольшой пример Джексона :

Сначала создайте держатель данных, который имеет поля из строки JSON.

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

И проанализировать список MyDataHolders

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

Использование элементов списка

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

Не могли бы вы привести мне пример, как мне получить JSON в виде строки из имеющегося у меня URL?
SteBra

1
В DefaultHttpClients-метод выполнение является блокирующим вызовом , так что должно быть сделано в фоновой задаче, просто чтобы сделать понятную , почему в отдельном классе.
vilpe89

Мне выдали ошибку о конструкторе HttpGetTask. «Конструктор HttpGetTask (OnHttpGetCompletedListener) относится к отсутствующему типу OnHttpGetCompletedListener»
SteBra

1
вы импортировали OnHttpGetCompletedListener? Как этоimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Да, это была проблема ... Спасибо за решение моей проблемы :)
SteBra

21
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

Вывод:

name1
url1
name2
url2

12

Создайте класс для хранения объектов.

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

Затем десериализуйте следующим образом:

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

Справочная статья: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Я предполагаю, что этот "ввод" будет URL-адресом этого json? Или что-то еще?
SteBra

Это очень простое решение. На мой взгляд, он должен быть принятым
FabioC

6

@Stebra См. Этот пример. Это может вам помочь.

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

И когда вы получите результат; разбирать как это

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());

1
Переменная результата - это ваша строка
JSONArray

Будет ли результирующая переменная URL-адресом, из которого мне нужно получить json, или уже полученным json?
SteBra

безусловно, самое простое решение
0x6C38 08

6

В этом примере есть несколько объектов внутри одного массива json. То есть,

Это массив json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ...]

Это один объект: {"name": "name1", "url": "url1"}

Предполагая, что вы получили результат в строковой переменной с именем jSonResultString:

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}

Мне сложно получить JSONstring из URL. Может, вы могли бы помочь с этим?
SteBra

Спасибо, что
разбили

3

Уже упоминалось несколько замечательных предложений. Использование GSON действительно очень удобно, и чтобы сделать жизнь еще проще, вы можете попробовать этот веб-сайт. Он называется jsonschema2pojo и делает именно это:

Вы даете ему свой json, и он генерирует объект java, который можно вставить в ваш проект. Вы можете выбрать GSON для аннотирования переменных, так что извлечение объекта из вашего json станет еще проще!


2

Мой случай Загрузить с сервера Пример ..

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

Надеюсь, это поможет


ps "jsonObject.getString (" messages ")" тип - jsonArray; первый существующий ответ - невозможно преобразовать строку в jsonArray; я исправлю это.
최봉재 05

-1

Создайте Java-класс POJO для объектов в списке следующим образом:

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

Теперь просто создайте List of NameUrlClass и инициализируйте его ArrayList следующим образом:

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

Вы можете использовать массив JSON в этом объекте

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]

1
Непонятно, что obj = JSONArray;делать. Что JSONArrayв этом контексте? Откуда это взялось? Какова цель инициализации objс помощью a new ArrayList<NameUrlClass>, если вы все равно заменяете его сразу после этого?
Макс Фоллмер,

-3

Старый пост я знаю, но если я неправильно понял вопрос, это должно помочь:

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}


-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.