So konvertieren Sie jsonString in Java in JSONObject

423

Ich habe eine String-Variable namens jsonString:

{"phonetype":"N95","cat":"WP"}

Jetzt möchte ich es in JSON Object konvertieren. Ich habe mehr bei Google gesucht, aber keine erwarteten Antworten erhalten ...

Herr Sajid Shaikh
quelle
1
Nein, es ist richtig, weil ich ein json-Objekt aus einem json-String erstellen wollte. Die Antwort von dogbane zeigte den richtigen Weg, um zu antworten.
Herr Sajid Shaikh
Beide Antworten von Mappan und Dogbane sind richtig, verwenden jedoch unterschiedliche Module. Sie sollten darauf achten, für jedes Modul das richtige Modul zu importieren, da es viele JSONObject-Module gibt.
Arashsoft
Ich habe es mit der GSON-Bibliothek versucht. Bitte überprüfen Sie diesen Link .
Thirumalvalavan
Hier ist ein kurzes Video, das zeigt, wie ein JSONObject in Java mit org.json erstellt wird.
Drorw

Antworten:

676

Verwenden der org.json- Bibliothek:

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}
Dogbane
quelle
7
Ich habe es so versucht JSONObject js = new JSONObject (jsonstring); aber es zeigt Fehler. auf jsonstring
Herr Sajid Shaikh
29
Er hat einen Fehler erhalten, weil er nicht org.json verwendet, sondern Google-gson, was nicht so funktioniert.
Gubatron
2
@Gubatron Danke, Alter, du hast Recht. Ich habe es gerade heruntergeladen und mache ein Glas, damit es jetzt gut funktioniert.
Herr Sajid Shaikh
3
@dogbane Was ist, wenn ich die Struktur des Strings nicht kenne? Wie kann ich einen dynamisch generierten jsonString in jsonObject konvertieren?
Saumyaraj
70
Mit Google-Gson können Sie es so machen:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
Kazy
163

An alle, die noch nach einer Antwort suchen:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
Mappan
quelle
23
Und können Sie bitte angeben, welches Paket für dasselbe importiert werden soll?
Gonephishing
10
Dies funktioniert für mich mit:import org.json.simple.JSONObject
Mafro34
1
Version 1.1.1 von json-simple scheint ein Problem zu haben. Das obige gibt "Unhandled Exception" für parser.parse(und will Try-Catch oder Würfe. Wenn Sie jedoch einen hinzufügen, wird ein Unhandled exception type ParseExceptionFehler oder ein NoClassDefFound-Fehler für ParseException ausgegeben, org.json.simple.parserselbst wenn Sie in Maven- Abhängigkeiten json-simple haben und in der Bibliothek des Projekts deutlich sichtbar sind.
Juha Untinen
2
org.json ist eine Proof-of-Concept-Bibliothek. Es ist eines der schlechtesten in Bezug auf Leistung und Funktionen. Man sollte sich vor der Auswahl den Funktionsumfang und die Leistung einer json lib ansehen. Sehen Sie sich diesen Benchmark an, den ich mit JMH durchgeführt habe: github.com/fabienrenaud/java-json-benchmark Er zeigt Jackson deutlich schneller als alles andere und 5- bis 6-mal schneller als org.json.
Fabien
5
JSONParser-Parser = neuer JSONParser (); scheint beraubt
Ouissal
46

Sie können verwenden google-gson. Einzelheiten:

Objektbeispiele

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(Serialisierung)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

Beachten Sie, dass Sie Objekte mit Zirkelverweisen nicht serialisieren können, da dies zu einer unendlichen Rekursion führt.

(Deserialisierung)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Ein weiteres Beispiel für Gson:

Gson ist leicht zu erlernen und zu implementieren. Sie müssen die folgenden zwei Methoden kennen:

-> toJson () - Konvertiert das Java-Objekt in das JSON-Format

-> fromJson () - JSON in Java-Objekt konvertieren

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

Ausgabe

{"data1":100,"data2":"hello"}

Ressourcen:

Startseite des Google Gson-Projekts

Gson Benutzerhandbuch

Beispiel

Kamaci
quelle
"Wenn Sie auf Client-Seite verarbeiten möchten, hängt dies von Ihrer Programmiersprache ab. Mit Java können Sie beispielsweise google-gson verwenden." Ich denke, Sie haben dort wahrscheinlich "Server" statt "Client" gemeint. Und er hat seine Frage mit "Java" markiert.
TJ Crowder
+1. Ich habe Gson jetzt in 4-5 Projekten verwendet, in ganz unterschiedlichen Kontexten, auf Server- und Clientseite (auch in der Android-App), und es hat mich nie im Stich gelassen. Sehr schöne und saubere Bibliothek.
Jonik
Wenn Sie gson verwenden möchten, aber keine vordefinierte POJO-Klasse haben (dh Sie haben einen generischen json ohne vordefinierte Struktur), kann diese Antwort hilfreich sein - stackoverflow.com/questions/4110664/…
Leandro David
40

Es gibt verschiedene Java JSON-Serializer und Deserializer, die über die JSON-Homepage verlinkt sind .

Zum jetzigen Zeitpunkt gibt es diese 22:

... aber natürlich kann sich die Liste ändern.

TJ Crowder
quelle
24

Java 7-Lösung

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;;

RSG
quelle
5
Diese Bibliothek hat die schlechteste Leistung von allen. Sehen Sie diesen Benchmark, den ich mit JMH gemacht habe: github.com/fabienrenaud/java-json-benchmark
fabien
15

Zur Umrechnung Stringin die JSONObjectSie gerade die brauchen passieren StringInstanz in Constructor von JSONObject.

Z.B:

JSONObject jsonObj = new JSONObject("your string");
Charu
quelle
10

Ich benutze dafür gerne Google-Gson, und das liegt genau daran, dass ich nicht direkt mit JSONObject arbeiten muss.

In diesem Fall hätte ich eine Klasse, die den Eigenschaften Ihres JSON-Objekts entspricht

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

Ich denke jedoch, dass Ihre Frage eher wie folgt lautet: Wie erhalte ich ein tatsächliches JSONObject-Objekt aus einer JSON-Zeichenfolge?

Ich habe mir die Google-JSON-API angesehen und konnte nichts so einfaches finden wie die API von org.json. Dies ist wahrscheinlich das, was Sie verwenden möchten, wenn Sie ein Barebone-JSONObject so dringend benötigen.

http://www.json.org/javadoc/org/json/JSONObject.html

Mit org.json.JSONObject (eine andere völlig andere API) Wenn Sie so etwas wie ...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

Ich denke, das Schöne an Google-Gson ist, dass Sie sich nicht mit JSONObject befassen müssen. Sie greifen einfach zu json, übergeben die Klasse, in die Sie deserialisieren möchten, und Ihre Klassenattribute werden mit dem JSON abgeglichen. Andererseits hat jeder seine eigenen Anforderungen. Vielleicht können Sie sich den Luxus nicht leisten, vorab zugeordnete Klassen zu haben die deserialisierende Seite, weil die Dinge auf der JSON-generierenden Seite möglicherweise zu dynamisch sind. In diesem Fall verwenden Sie einfach json.org.

Gubatron
quelle
8

Sie müssen org.json importieren

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }
Cabezas
quelle
8

String zu JSON Verwendung Jacksonmit com.fasterxml.jackson.databind:

Angenommen, Ihre JSON-Zeichenfolge lautet wie folgt: jsonString = {"phonetype": "N95", "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();
Yugerten
quelle
3

Wenn Sie http://json-lib.sourceforge.net verwenden (net.sf.json.JSONObject)

es ist ziemlich einfach:

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

oder

JSONObject json = JSONSerializer.toJSON(myJsonString);

Holen Sie sich die Werte dann mit json.getString (param), json.getInt (param) und so weiter.

Thero
quelle
JSONObject json = JSONSerializer.toJSON (myJsonString); wird einen Fehler vom Typ Mismatch produzieren, den der andere funktioniert
Henrique C.
3

Eine Zeichenfolge in json und den Stich umzuwandeln ist wie json. {"Phonetyp": "N95", "Katze": "WP"}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);
Aravind Cheekkallur
quelle
Was ist JSONParser? Ist es nur ein Teil des Kontaktanbieters?
IgorGanapolsky
1
@IgorGanapolsky JSONParser ist eine integrierte Option, die von einfachem JSON bereitgestellt wird. Dazu gehören json-simple-1.1.1.jar
Aravind Cheekkallur
3

Verwenden Sie JsonNode von schnellerxml für das generische Json-Parsing. Es wird intern eine Karte mit Schlüsselwerten für alle Eingaben erstellt.

Beispiel:

private void test(@RequestBody JsonNode node)

Eingabezeichenfolge:

{"a":"b","c":"d"}
Vishnu
quelle
2

Keine Notwendigkeit, eine externe Bibliothek zu verwenden.

Sie können diese Klasse stattdessen verwenden :) (behandelt gerade Listen, verschachtelte Listen und JSON)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

Verwenden Sie Folgendes, um Ihre JSON-Zeichenfolge in eine Hashmap zu konvertieren :

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(
Natesh bhat
quelle
2

Codehaus Jackson - Ich bin seit 2012 diese großartige API für meine RESTful-Webservice- und JUnit-Tests. Mit ihrer API können Sie:

(1) Konvertieren Sie den JSON-String in eine Java-Bean

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2) Konvertieren Sie den JSON-String in ein JSON-Objekt (JsonNode).

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3) Konvertieren Sie Java Bean in JSON String

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS:

  1. Codehaus Jackson

  2. JsonNode-API - Verwenden, Navigieren, Analysieren und Auswerten von Werten aus einem JsonNode-Objekt

  3. Tutorial - Einfaches Tutorial zur Verwendung von Jackson zum Konvertieren von JSON-Zeichenfolgen in JsonNode

Panini Luncher
quelle
1

HINWEIS: GSON beim Deserialisieren einer Schnittstelle führt zu einer Ausnahme wie unten.

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

Während deserialisieren; GSON weiß nicht, welches Objekt für diese Schnittstelle intantiert werden muss.

Dies ist hier irgendwie gelöst .

Jedoch FlexJSON hat diese Lösung von Natur aus . Während der Serialisierung wird der Klassenname als Teil von json wie unten hinzugefügt.

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

Also wird JSON einige belasten; Sie müssen jedoch nicht schreiben, InstanceCreatorwas in GSON erforderlich ist.

Kanagavelu Sugumar
quelle
1

Verwenden von org.json

Wenn Sie eine Zeichenfolge mit Text im JSON-Format haben, können Sie das JSON-Objekt mithilfe der folgenden Schritte abrufen:

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Nun können Sie auf den Phonetyp zugreifen

Sysout.out.println(jsonObject.getString("phonetype"));
Azhar Zafar
quelle
0

Zum Setzen von json single object auf list dh

"locations":{

}

in zu List<Location>

verwenden

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar

user3012570
quelle
0

Konvertieren eines Strings in ein Json-Objekt mithilfe von org.json.simple.JSONObject

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}
Anzar Ansari
quelle
-1

Besser Gehen Sie mit org.jsonlib auf einfachere Weise . Gehen Sie einfach wie folgt vor:

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

Jetzt objist Ihre konvertierte JSONObjectForm Ihres jeweiligen Strings. Dies ist der Fall, wenn Sie Name-Wert-Paare haben.

Für eine Zeichenfolge können Sie direkt an den Konstruktor von übergeben JSONObject. Wenn es gültig ist json String, dann okay, sonst wird eine Ausnahme ausgelöst.

TheLittleNaruto
quelle
user.put("email", "[email protected]")Wenn Sie buchstäblich das tun, was Sie geschrieben haben, wird eine unbehandelte Ausnahme ausgelöst.
Sebastialonso
1
@Sebastialonso Ja, Sie müssen die Ausnahme abfangen. So:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto
@vidya Nein, ist es nicht. Betrachten Sie es noch einmal zu vergleichen.
TheLittleNaruto
@vidya Sure Dude
TheLittleNaruto