Come convertire jsonString in JSONObject in Java


423

Ho una variabile String chiamata jsonString:

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

Ora voglio convertirlo in JSON Object. Ho cercato di più su Google ma non ho ricevuto risposte attese ...


1
No, è giusto, perché volevo creare un oggetto json dalla stringa json, la risposta data da dogbane ha mostrato la strada giusta per rispondere.
Mr. Sajid Shaikh,

Entrambe le risposte di Mappan e dogbane sono corrette ma utilizzano moduli diversi. Dovresti stare attento a importare il modulo corretto per ognuno perché ci sono molti moduli JSONObject.
Arashsoft,

Ho provato con la libreria GSON. Si prega di controllare questo link .
Thirumalvalavan,

Risposte:


678

Utilizzando la libreria org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}

7
Ho provato così JSONObject js = new JSONObject (jsonstring); ma mostra errore. su jsonstring
Mr. Sajid Shaikh

29
ha ricevuto un errore perché non utilizza org.json, utilizza google-gson che non funziona in questo modo.
Gubatron,

2
@Gubatron Grazie amico, hai ragione, l'ho appena scaricato e ho creato Jar, quindi ora funziona benissimo.
Mr. Sajid Shaikh,

3
@dogbane Cosa succede se non conosco la struttura della stringa. Più chiaramente, come posso convertire un jsonString generato dinamico in jsonObject?
Saumyaraj,

70
Usando google-gson puoi farlo in questo modo:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

A chiunque cerchi ancora una risposta:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

23
E puoi per favore menzionare quale pacchetto importare per lo stesso?
gophishing,

10
Questo funziona per me con:import org.json.simple.JSONObject
Mafro34

1
La versione 1.1.1 di json-simple sembra avere qualche problema. Quanto sopra fornisce "Eccezione non gestita" per parser.parse(e desidera un tentativo di cattura o di lancio. Ma quando si aggiunge uno di questi, si ottiene un Unhandled exception type ParseExceptionerrore o un errore NoClassDefFound per ParseException org.json.simple.parseranche quando si ha json-simple nelle dipendenze di Maven e chiaramente visibile nella libreria del progetto.
Juha Untinen,

2
org.json è una libreria di prove concettuali. è uno dei peggiori in termini di prestazioni e funzionalità. Si dovrebbe guardare il set di funzionalità e le prestazioni di una libreria json prima di scegliere. Vedi questo benchmark che ho fatto usando JMH: github.com/fabienrenaud/java-json-benchmark Mostra chiaramente jackson più velocemente di qualsiasi altra cosa e da 5 a 6 volte più veloce di org.json.
fabien,

5
Parser JSONParser = new JSONParser (); sembra
depresso

46

È possibile utilizzare google-gson. Dettagli:

Esempi di oggetti

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

(Serializzazione)

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

Si noti che non è possibile serializzare oggetti con riferimenti circolari poiché ciò comporterà una ricorsione infinita.

(Deserializzazione)

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

Un altro esempio per Gson:

Gson è facile da imparare e implementare, devi sapere che sono i seguenti due metodi:

-> toJson () - converte l'oggetto java in formato JSON

-> fromJson () - converte JSON in oggetto java

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

}

Produzione

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

risorse:

Home page del progetto Google Gson

Guida per l'utente Gson

Esempio


"Se stai chiedendo di elaborare sul lato client dipende dal tuo linguaggio di programmazione. Ad esempio con Java puoi usare google-gson" Penso che tu abbia probabilmente inteso "server" anziché "client" lì. E ha taggato la sua domanda "Java".
TJ Crowder,

+1. Ho usato Gson in 4-5 progetti ora, in contesti piuttosto diversi, lato server e client (anche nell'app Android), e non mi ha mai deluso. Lib molto bella e pulita.
Jonik,

Se vuoi usare gson ma non hai una classe POJO predefinita (cioè hai un json generico senza una struttura predefinita), questa risposta può essere d'aiuto - stackoverflow.com/questions/4110664/…
Leandro David



15

Per convertirti Stringin JSONObjectdevi solo passare l' Stringistanza a Costruttore di JSONObject.

Per esempio:

JSONObject jsonObj = new JSONObject("your string");

10

Mi piace usare google-gson per questo, ed è proprio perché non ho bisogno di lavorare direttamente con JSONObject.

In tal caso, avrei una classe che corrisponderà alle proprietà del tuo oggetto JSON

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

Tuttavia, penso che la tua domanda sia più simile a: Come faccio a finire con un vero oggetto JSONObject da una stringa JSON.

Stavo guardando l'API google-json e non riuscivo a trovare nulla di semplice come l'API di org.json che è probabilmente quello che vuoi usare se hai così fortemente bisogno di usare un JSONObject barebone.

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

Con org.json.JSONObject (un'altra API completamente diversa) Se vuoi fare qualcosa come ...

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

Penso che la bellezza di google-gson sia che non è necessario gestire JSONObject. Devi solo prendere JSON, passare la classe in cui deserializzare e gli attributi della tua classe saranno abbinati al JSON, ma poi di nuovo, ognuno ha i propri requisiti, forse non puoi permetterti il ​​lusso di avere classi pre-mappate su il lato deserializzante perché le cose potrebbero essere troppo dinamiche sul lato della generazione JSON. In tal caso basta usare json.org.


8

devi importare org.json

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

8

Stringa a JSON utilizzando Jacksoncon com.fasterxml.jackson.databind:

Supponendo che la tua stringa json rappresenti come segue: jsonString = {"fonipo": "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();

3

Se si utilizza http://json-lib.sourceforge.net (net.sf.json.JSONObject)

è abbastanza facile:

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

o

JSONObject json = JSONSerializer.toJSON(myJsonString);

ottenere i valori quindi con json.getString (param), json.getInt (param) e così via.


JSONObject json = JSONSerializer.toJSON (myJsonString); produrrà un erroe di tipo non corrispondente all'altro funziona
Henrique C.

3

Per convertire una stringa in json e la puntura è come json. { "PHONETYPE": "N95", "cat": "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);

Che cos'è JSONParser? Fa solo parte del fornitore di contatti?
IgorGanapolsky,

1
@IgorGanapolsky JSONParser è un buit in opzione fornito da JSON semplice. Per fare questo, includi json-simple-1.1.1.jar
Aravind Cheekkallur

3

Utilizzare JsonNode di fastxml per il Json Parsing generico. Crea internamente una Mappa del valore chiave per tutti gli input.

Esempio:

private void test(@RequestBody JsonNode node)

stringa di input:

{"a":"b","c":"d"}

2

Non è necessario utilizzare alcuna libreria esterna.

Puoi invece usare questa classe :) (gestisce elenchi pari, elenchi nidificati e 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;
    }
}

Per convertire la tua stringa JSON in hashmap usa questo:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(

2

Codehaus Jackson - Sono questa fantastica API dal 2012 per i miei test di servizio Web e JUnit RESTful. Con la loro API, puoi:

(1) Converti stringa JSON in bean Java

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

(2) Converti stringa JSON in oggetto JSON (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) Converti bean Java in stringa JSON

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

REFS:

  1. Codehaus Jackson

  2. API JsonNode : come utilizzare, navigare, analizzare e valutare i valori da un oggetto JsonNode

  3. Tutorial - Semplice tutorial su come usare Jackson per convertire una stringa JSON in JsonNode


1

Si noti che GSON con la deserializzazione di un'interfaccia si tradurrà in un'eccezione come di seguito.

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

Mentre deserializzare; GSON non sa quale oggetto deve essere creato per quell'interfaccia.

Questo è risolto in qualche modo qui .

Tuttavia FlexJSON ha questa soluzione intrinsecamente. mentre serializzare il tempo sta aggiungendo il nome della classe come parte di json come di seguito.

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

Quindi JSON ne diventerà un po 'un po'; ma non è necessario scrivere ciò InstanceCreatorche è richiesto in GSON.


1

Utilizzando org.json

Se si dispone di una stringa contenente testo in formato JSON, è possibile ottenere l'oggetto JSON procedendo come segue:

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

Ora per accedere al fonipo

Sysout.out.println(jsonObject.getString("phonetype"));

0

Per impostare un singolo oggetto json nell'elenco, ad es

"locations":{

}

in a List<Location>

uso

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

jackson.mapper-asl-1.9.7.jar


0

Conversione di String in Json Object utilizzando 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;
}

-1

Meglio andare con un modo più semplice usando org.jsonlib. Basta seguire un approccio molto semplice come di seguito:

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

Ora objè la JSONObjectforma convertita della rispettiva stringa. Questo è nel caso in cui si abbiano coppie nome-valore.

Per una stringa puoi passare direttamente al costruttore di JSONObject. Se sarà valido json String, allora va bene altrimenti genererà un'eccezione.


Letteralmente facendo ciò che hai scritto: user.put("email", "someemail@mail.com")innesca un'eccezione non gestita.
Sebastialonso,

1
@Sebastialonso Sì, devi cogliere l'eccezione. In questo modo:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto il

@vidya No non lo è. Valuta di confrontarlo di nuovo.
TheLittleNaruto,

@vidya Sure Dude
TheLittleNaruto,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.