Як проаналізувати масив JSON (не об’єкт Json) в Android


90

У мене проблеми з пошуком способу синтаксичного аналізу JSONArray. Це виглядає так:

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

Я знаю, як проаналізувати його, якщо JSON було написано інакше (Іншими словами, якщо б я повернув об'єкт json замість масиву об'єктів). Але це все, що я маю і маю з цим піти.

* EDIT: Це дійсний 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

Відповіді:


146

використовуйте наступний фрагмент для синтаксичного аналізу 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] і ця цифра всередині включає знову масив, тому, якщо я хочу отримати з особливо, скажімо, масив, вкладений у числовий [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
Метод DefaultHttpClientExecute s є блокувальним викликом, тому його потрібно виконувати у фоновому завданні, лише щоб зрозуміти, чому він знаходиться в окремому класі.
vilpe89

Мені видається помилка щодо конструктора HttpGetTask. "Конструктор HttpGetTask (OnHttpGetCompletedListener) відноситься до відсутнього типу OnHttpGetCompletedListener"
SteBra

1
Ви імпортували OnHttpGetCompletedListener? Як цеimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Так, це була проблема ... Дякую за вирішення мого питання :)
SteBra

20
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 або вже отриманого json?
SteBra

безумовно, найпростіше рішення
0x6C38

6

У цьому прикладі всередині одного масиву json є кілька об’єктів. Це є,

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

Це один об’єкт: {"name": "name1", "url": "url1"}

Припускаючи, що ви отримали результат до змінної String з назвою 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"));
                }

Сподіваюся, це допоможе


тип "jsonObject.getString (" повідомлення ")" є jsonArray; перша існуюча відповідь - неможливо перетворити рядок у jsonArray; я це виправляю.
최봉재

-1

Створіть POJO Java-клас для об’єктів у списку так:

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

Тепер просто створіть Список 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.