So analysieren Sie JSON-Arrays (nicht Json-Objekte) in Android


89

Ich habe Probleme, einen Weg zu finden, wie JSONArray analysiert werden kann. Es sieht aus wie das:

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

Ich weiß, wie man es analysiert, wenn der JSON anders geschrieben wurde (mit anderen Worten, wenn ich ein json-Objekt anstelle eines Arrays von Objekten zurückgegeben habe). Aber es ist alles was ich habe und muss damit gehen.

* EDIT: Es ist ein gültiger JSON. Ich habe mit diesem JSON eine iPhone-App erstellt. Jetzt muss ich sie für Android ausführen und kann es nicht herausfinden. Es gibt viele Beispiele, aber alle beziehen sich auf JSONObject. Ich brauche etwas für JSONArray.

Kann mir bitte jemand einen Hinweis oder ein Tutorial oder ein Beispiel geben?

Sehr geschätzt!


1
Versuchen Sie dies, um zu sehen, ob Ihr json gültig ist. Json.parser.online.fr
An-

Verwenden Sie eine Bibliothek zum Parsen von JSON? Verwenden Sie die gson-Bibliothek für das json-Parsing. Viel Hilfreich.
Nilkash

Es ist gültig. Ich habe es in einer App analysiert, die ich für ein iPhone erstellt habe. Und es funktioniert. Ich weiß nur nicht, wie es in Android geht
SteBra

1
@ Nikash, ja, ich habe bemerkt, dass ich Gson verwenden könnte. Das einzige Problem ist, dass alle Beispiele, die ich gefunden habe, zum Parsen eines JSONObjects und nicht von JSONArray
SteBra

Veröffentlichen Sie Ihren Code, den Sie bisher ausprobiert haben. Es ist hilfreich, eine genaue Antwort entsprechend zu geben.
Spring Breaker

Antworten:


143

Verwenden Sie das folgende Snippet, um das JsonArray zu analysieren.

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");
}

Ich hoffe es hilft.


nur eine Frage, wenn jsonarray Zahlen wie [2] enthält. [4] und dass die darin enthaltenen Zahlen wieder ein Array enthalten. Wenn ich also insbesondere das Array abrufen möchte, das in Java-Code in numerisch [4] verschachtelt ist, muss ich int i = 4 schreiben ???
BiggDawgg

@BiggDawgg: Ich bin froh, dass es dir geholfen hat. Stellen Sie Ihre Frage in einem separaten Thread mit JSON-Daten, damit ich sie leicht beantworten kann.
Spring Breaker

26

Ich werde nur ein kleines Jackson- Beispiel geben:

Erstellen Sie zunächst einen Datenhalter mit den Feldern aus der JSON-Zeichenfolge

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

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

Und Analyse der Liste der MyDataHolders

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

Listenelemente verwenden

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

Können Sie mir ein Beispiel geben, wie ich JSON als Zeichenfolge von meiner URL erhalten könnte?
SteBra

1
Die DefaultHttpClients execute-Methode ist ein blockierender Aufruf, daher muss sie in einer Hintergrundaufgabe ausgeführt werden, um zu verdeutlichen, warum sie sich in einer separaten Klasse befindet.
vilpe89

Ich bekomme einen Fehler über den Konstruktor von HttpGetTask. "Der Konstruktor HttpGetTask (OnHttpGetCompletedListener) verweist auf den fehlenden Typ OnHttpGetCompletedListener"
SteBra

1
Haben Sie OnHttpGetCompletedListener importiert? Soimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Ja, das war das Problem ... Danke, dass
du

19
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);
    }   
}   

Ausgabe:

name1
url1
name2
url2

12

Erstellen Sie eine Klasse für die Objekte.

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

Deserialisieren Sie dann wie folgt:

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

Referenzartikel: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Ich nehme an, diese "Eingabe" wäre eine URL zu diesem JSON? oder ist es etwas anderes
SteBra

Dies ist eine sehr einfache Lösung. Es sollte aus meiner Sicht die akzeptierte sein
FabioC

6

In diesem Beispiel befinden sich mehrere Objekte in einem JSON-Array. Das ist,

Dies ist das JSON-Array: [{"Name": "Name1", "URL": "URL1"}, {"Name": "Name2", "URL": "URL2"}, ...]

Dies ist ein Objekt: {"name": "name1", "url": "url1"}

Angenommen, Sie haben das Ergebnis für eine String-Variable namens jSonResultString erhalten:

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");


}

Es fällt mir schwer, meinen JSONstring von der URL zu bekommen. Vielleicht könnten Sie dabei helfen?
SteBra

Vielen Dank, dass Sie es mit Beispielen aufgeschlüsselt haben, gute Klarheit
Ryvianstyron

5

@Stebra Siehe dieses Beispiel. Dies kann Ihnen helfen.

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

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

Und wenn Sie das Ergebnis erhalten; so analysieren

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

1
Ergebnisvariable ist Ihr JSONArray String
nilkash

Wäre die Ergebnisvariable die URL, die ich zum Abrufen von JSON benötige, oder die bereits abgerufene JSON?
SteBra

bei weitem die einfachste Lösung
0x6C38

3

Einige gute Vorschläge sind bereits erwähnt. Die Verwendung von GSON ist in der Tat sehr praktisch. Um das Leben noch einfacher zu gestalten, können Sie diese Website ausprobieren Sie Sie heißt jsonschema2pojo und macht genau das:

Sie geben ihm Ihren JSON und es wird ein Java-Objekt generiert, das in Ihr Projekt eingefügt werden kann. Sie können GSON auswählen, um Ihre Variablen mit Anmerkungen zu versehen, sodass das Extrahieren des Objekts aus Ihrem JSON noch einfacher wird!


2

Mein Fall Laden vom Server Beispiel ..

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"));
                }

Hoffe es hilft


ps Typ "jsonObject.getString (" messages ")" ist jsonArray; Die erste Antwort lautet: Der String kann nicht in jsonArray konvertiert werden. Ich repariere es.
5.

-1

Erstellen Sie eine POJO-Java-Klasse für die Objekte in der Liste wie folgt:

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

Erstellen Sie nun einfach eine Liste von NameUrlClass und initialisieren Sie sie wie folgt in einer ArrayList:

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

Sie können das JSON-Array in diesem Objekt speichern

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

1
Es ist nicht klar, was obj = JSONArray;zu tun ist. Was ist JSONArrayin diesem Zusammenhang? Woher kommt das? Was ist der Zweck der Initialisierung objmit a new ArrayList<NameUrlClass>, wenn Sie es sowieso direkt danach ersetzen?
Max Vollmer

-3

Alter Beitrag, den ich kenne, aber wenn ich die Frage nicht falsch verstanden habe, sollte dies den Trick tun:

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.