webentwicklung-frage-antwort-db.com.de

Wie konvertiert man Java-String in JSON-Objekt?

Diese Frage wurde zuvor gestellt, aber ich kann den Fehler in meinem Code nicht aus den Antworten auf diese Fragen ermitteln.


Ich versuche einen Java-String in ein Json-Objekt zu konvertieren .. Hier ist der Code:

import org.json.JSONObject;
//Other lines of code
URL seatURL = new URL("http://freemusicarchive.org/api/get/genres.json?api_key=60BLHNQCAOUFPIBZ&limit=2");
//Return the JSON Response from the API
BufferedReader br = new BufferedReader(new InputStreamReader(seatURL.openStream(),Charset.forName("UTF-8")));
String readAPIResponse = " ";
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString);
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);

Die Ausgabe ist:

{"title":"Free Music Archive - Genres","message":"","errors":[],"total":"163","total_pages":82,"page":1,"limit":"2","dataset":[{"genre_id":"1","genre_parent_id":"38","genre_title":"Avant-Garde","genre_handle":"Avant-Garde","genre_color":"#006666"},{"genre_id":"2","genre_parent_id":null,"genre_title":"International","genre_handle":"International","genre_color":"#CC3300"}]}
---------------------------
{}

Wie Sie sehen, erhält der Jsonstring die Daten, der JsonObj jedoch nicht. Ich verwende org.json JAR.

6
Nishit

Sie übergeben eine Instanz einer JSONObject-Klasse an den Konstruktor StringBuilder.

Dies verwendet den Konstruktor JSONObject(Object), nicht den Konstruktor JSONObject(String).

Ihr Code sollte lauten:

JSONObject jsonObj = new JSONObject(jsonString.toString());
16
pseudonym

@Nishit, versteht JSONObject nicht nativ, wie ein StringBuilder analysiert wird. Stattdessen verwenden Sie scheinbar den JSONObject-Konstruktor (Java.lang.Object-Bean), um das JSONObject zu erstellen, übergeben jedoch einen StringBuilder. 

Unter diesem Link finden Sie weitere Informationen zu diesem bestimmten Konstruktor.

http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject%28Java.lang.Object%29

Wenn ein Konstruktor eine Java.lang.Object-Klasse aufruft, wird höchstwahrscheinlich wirklich gesagt, dass Sie eine eigene Klasse erstellen müssen (da alle Klassen Java.lang.Object letztendlich erweitern) und dass sie mit dieser Klasse verbunden wird auf eine bestimmte Weise, obwohl normalerweise eine Schnittstelle aufgerufen wird (daher der Name) OR, kann sie jede Klasse und Schnittstelle "abstrakt" akzeptieren, wie z. B. den Aufruf von .toString (). Unterm Strich können Sie normalerweise nicht einfach die Klasse any übergeben und erwarten, dass sie funktioniert.

In jedem Fall wird dieser spezielle Konstruktor als solcher erklärt:

Konstruieren Sie ein JSONObject mit Bean-Gettern aus einem Objekt. Es reflektiert alle öffentlichen Methoden des Objekts. Für jede der Methoden ohne Parameter und einen Namen, der mit "get" oder "is" beginnt, gefolgt von einem Großbuchstaben, wird die Methode aufgerufen, und ein Schlüssel und der von der Getter-Methode zurückgegebene Wert werden in das neue JSONObject eingefügt. Der Schlüssel wird durch Entfernen des Präfixes "get" oder "is" gebildet. Wenn das zweite verbleibende Zeichen kein Großbuchstabe ist, wird das erste Zeichen in Kleinbuchstaben umgewandelt. Wenn ein Objekt beispielsweise eine Methode mit dem Namen "getName" hat und das Ergebnis des Aufrufs von object.getName () "Larry Fine" ist, enthält das JSONObject "name": "Larry Fine". 

Das bedeutet also, dass Sie davon ausgehen, dass Sie Ihre eigene Klasse erstellen, die get oder ist Methoden (d. H. 

public String getName() {...}

oder

public boolean isValid() {...}

Um Ihr Problem zu lösen, wenn Sie wirklich diese übergeordnete Kontrolle haben möchten und einige Änderungen vornehmen möchten (z. B. einige Werte ändern usw.), den Code jedoch weiterhin mit StringBuilder dynamisch generieren möchten, können Sie eine Klasse erstellen, die den StringBuilder erweitert Klasse, so dass Sie die Append-Funktion verwenden können, aber Get/Is-Methoden implementieren, um JSONObject das Abrufen der Daten zu ermöglichen. Dies ist jedoch wahrscheinlich nicht das, was Sie wollen/brauchen, und je nach JSON können Sie viel Zeit aufwenden und Energie, die private Felder und get/is-Methoden erstellt (oder verwenden Sie eine IDE, um dies für Sie zu tun) oder es ist alles umsonst, wenn Sie nicht unbedingt die Aufteilung des JSON-Strings kennen.

Sie können also einfach toString() für den StringBuilder aufrufen, der eine String-Darstellung der StringBuilder-Instanz bereitstellt und diese an den JSONObject-Konstruktor weitergibt, wie im Folgenden:

...
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString.toString());
...
2
Brooks

Konvertieren des Strings in JsonNode mithilfe des ObjectMapper-Objekts:

ObjectMapper mapper = new ObjectMapper();

// For text string
JsonNode = mapper.readValue(mapper.writeValueAsString("Text-string"), JsonNode.class)

// For Array String
JsonNode = mapper.readValue("[\"Text-Array\"]"), JsonNode.class)

// For Json String 
String json = "{\"id\" : \"1\"}";
ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getFactory();
JsonParser jsonParser = factory.createParser(json);
JsonNode node = mapper.readTree(jsonParser);
1
Rahul Chauhan

Die Zeichenfolge, die Sie an den Konstruktor JSONObject übergeben, muss mit quote() mit Escapezeichen versehen werden:

public static Java.lang.String quote(Java.lang.String string)

Ihr Code würde jetzt lauten:

JSONObject jsonObj = new JSONObject.quote(jsonString.toString());
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);
0
Ola