Comment convertir jsonString en JSONObject en Java

423

J'ai une variable String appelée jsonString:

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

Maintenant, je veux le convertir en objet JSON. J'ai cherché plus sur Google mais je n'ai pas obtenu de réponses attendues ...

M. Sajid Shaikh
la source
1
Non, c'est vrai, parce que je voulais créer un objet json à partir d'une chaîne json, la réponse donnée par dogbane a montré la bonne voie pour répondre.
M. Sajid Shaikh
Les réponses de Mappan et de Dogbane sont correctes mais utilisent des modules différents. Vous devez faire attention à importer le module correct pour chacun car il existe de nombreux modules JSONObject.
Arashsoft
J'ai essayé avec la bibliothèque GSON. Veuillez vérifier ce lien .
Thirumalvalavan
Voici une courte vidéo qui montre comment créer un JSONObject en Java en utilisant org.json.
drorw

Réponses:

678

Utilisation de la bibliothèque org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}
dogbane
la source
7
J'ai essayé avec comme ça JSONObject js = new JSONObject (jsonstring); mais cela montre une erreur. sur jsonstring
M. Sajid Shaikh
29
il a une erreur parce qu'il n'utilise pas org.json, il utilise google-gson qui ne fonctionne pas de cette façon.
Gubatron
2
@Gubatron Merci mec, tu as raison, je viens de le télécharger et de faire un bocal maintenant ça marche bien.
M. Sajid Shaikh
3
@dogbane Et si je ne connais pas la structure de la chaîne. Plus clairement, comment convertir un jsonString généré dynamiquement en jsonObject?
Saumyaraj
70
En utilisant google-gson, vous pouvez le faire comme ceci:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy
163

À tous ceux qui recherchent toujours une réponse:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
Mappan
la source
23
Et pouvez-vous s'il vous plaît mentionner quel package importer pour la même chose?
phishing passé
10
Cela fonctionne pour moi avec:import org.json.simple.JSONObject
Mafro34
1
La version 1.1.1 de json-simple semble avoir un problème. Ce qui précède donne "Exception non gérée" pour parser.parse(et veut essayer-attraper ou lancer. Mais lorsque vous ajoutez l'un ou l'autre, cela donne une Unhandled exception type ParseExceptionerreur, ou une erreur NoClassDefFound pour ParseException org.json.simple.parsermême lorsque vous avez json-simple dans les dépendances Maven et clairement visible dans la bibliothèque du projet.
Juha Untinen
2
org.json est une bibliothèque de preuve de concept. c'est l'un des pires en termes de performances et de fonctionnalités. Il faut regarder l'ensemble des fonctionnalités et les performances d'une bibliothèque json avant de choisir. Voir ce benchmark que j'ai fait en utilisant JMH: github.com/fabienrenaud/java-json-benchmark Il montre clairement jackson plus rapidement que toute autre chose et 5 à 6 fois plus rapide que org.json.
fabien
5
Analyseur JSONParser = new JSONParser (); semble privé
Ouissal
46

Vous pouvez utiliser google-gson. Détails:

Exemples d'objets

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

(Sérialisation)

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

Notez que vous ne pouvez pas sérialiser des objets avec des références circulaires car cela entraînera une récursion infinie.

(Désérialisation)

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

Un autre exemple pour Gson:

Gson est facile à apprendre et à implémenter, vous devez connaître les deux méthodes suivantes:

-> toJson () - convertir un objet java au format JSON

-> fromJson () - convertir JSON en objet 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);
  }

}

Production

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

Ressources:

Page d'accueil du projet Google Gson

Guide de l'utilisateur Gson

Exemple

kamaci
la source
"Si vous demandez à traiter côté client, cela dépend de votre langage de programmation. Par exemple, avec Java, vous pouvez utiliser google-gson" Je pense que vous vouliez probablement dire "serveur" plutôt que "client". Et il a marqué sa question "Java".
TJ Crowder
+1. J'ai utilisé Gson dans 4 à 5 projets maintenant, dans des contextes très différents, côté serveur et côté client (également dans l'application Android), et cela ne m'a jamais échoué. Lib très agréable et propre.
Jonik
Si vous souhaitez utiliser gson mais n'avez pas de classe POJO prédéfinie (c'est-à-dire que vous avez un json générique sans structure prédéfinie), cette réponse peut vous aider - stackoverflow.com/questions/4110664/…
Leandro David
40

Il existe différents sérialiseurs et désérialiseurs Java JSON liés à partir de la page d'accueil JSON .

Au moment d'écrire ces lignes, il y en a 22:

... mais bien sûr la liste peut changer.

TJ Crowder
la source
24

Solution Java 7

import javax.json.*;

...

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

;

RSG
la source
5
Cette bibliothèque a la pire performance de toutes. Voir ce benchmark que j'ai fait avec JMH: github.com/fabienrenaud/java-json-benchmark
fabien
15

Pour convertir Stringen il JSONObjectvous suffit de passer l' Stringexemple dans Constructor de JSONObject.

Par exemple:

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

J'aime utiliser google-gson pour cela, et c'est précisément parce que je n'ai pas besoin de travailler directement avec JSONObject.

Dans ce cas, j'aurais une classe qui correspondrait aux propriétés de votre objet 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);
...

Cependant, je pense que votre question ressemble plus à: Comment puis-je me retrouver avec un véritable objet JSONObject à partir d'une chaîne JSON.

Je regardais l'api google-json et je n'ai rien trouvé d'aussi simple que l'api org.json qui est probablement ce que vous voulez utiliser si vous avez tellement besoin d'utiliser un JSONObject barebones.

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

Avec org.json.JSONObject (une autre API complètement différente) Si vous voulez faire quelque chose comme ...

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

Je pense que la beauté de google-gson est que vous n'avez pas besoin de traiter avec JSONObject. Vous prenez juste json, passez la classe pour désérialiser, et vos attributs de classe seront mis en correspondance avec le JSON, mais là encore, tout le monde a ses propres exigences, peut-être que vous ne pouvez pas vous permettre le luxe d'avoir des classes pré-mappées du côté de la désérialisation, car les choses peuvent être trop dynamiques du côté de la génération JSON. Dans ce cas, utilisez simplement json.org.

Gubatron
la source
8

vous devez importer org.json

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

Chaîne en JSON en utilisant Jacksonavec com.fasterxml.jackson.databind:

En supposant que votre chaîne json représente comme ceci: 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
la source
3

Si vous utilisez http://json-lib.sourceforge.net (net.sf.json.JSONObject)

c'est assez simple:

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

ou

JSONObject json = JSONSerializer.toJSON(myJsonString);

récupérez ensuite les valeurs avec json.getString (param), json.getInt (param) et ainsi de suite.

Thero
la source
JSONObject json = JSONSerializer.toJSON (myJsonString); produira un erroe de type mismatch l'autre travaille
Henrique C.
3

Pour convertir une chaîne en json et la piqûre est comme 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);
Aravind Cheekkallur
la source
Qu'est-ce que JSONParser? Est-ce seulement une partie du fournisseur de contacts?
IgorGanapolsky
1
@IgorGanapolsky JSONParser est un buit en option fourni par le simple JSON. Pour ce faire, incluez json-simple-1.1.1.jar
Aravind Cheekkallur
3

Utilisez JsonNode de fastxml pour l'analyse générique Json. Il crée en interne une carte de valeur clé pour toutes les entrées.

Exemple:

private void test(@RequestBody JsonNode node)

chaîne d'entrée:

{"a":"b","c":"d"}
Vishnu
la source
2

Pas besoin d'utiliser une bibliothèque externe.

Vous pouvez utiliser cette classe à la place :) (gère les listes paires, les listes imbriquées et 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;
    }
}

Pour convertir votre chaîne JSON en hashmap, utilisez ceci:

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

Codehaus Jackson - Je suis cette API géniale depuis 2012 pour mes tests de service Web RESTful et JUnit. Avec leur API, vous pouvez:

(1) Convertir la chaîne JSON en bean Java

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

(2) Convertir la chaîne JSON en objet 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) Convertir le bean Java en chaîne 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 - Comment utiliser, naviguer, analyser et évaluer les valeurs d'un objet JsonNode

  3. Tutoriel - Tutoriel simple comment utiliser Jackson pour convertir une chaîne JSON en JsonNode

Panini Luncher
la source
1

REMARQUE: GSON avec désérialisation d'une interface entraînera une exception comme ci-dessous.

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

Pendant la désérialisation; GSON ne sait pas quel objet doit être créé pour cette interface.

Ceci est résolu d'une manière ou d'une autre ici .

Cependant FlexJSON a cette solution intrinsèquement. tout en sérialisant le temps, il ajoute le nom de classe dans le cadre de json comme ci-dessous.

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

JSON sera donc un peu plus lourd; mais vous n'avez pas besoin d'écrire InstanceCreatorqui est requis dans GSON.

Kanagavelu Sugumar
la source
1

Utiliser org.json

Si vous avez une chaîne contenant du texte au format JSON, vous pouvez obtenir un objet JSON en procédant comme suit:

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

Maintenant, pour accéder au type de téléphone

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

Pour définir json single object à lister ie

"locations":{

}

pour List<Location>

utilisation

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

jackson.mapper-asl-1.9.7.jar

user3012570
la source
0

Conversion de chaîne en objet Json à l'aide de 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
la source
-1

Mieux aller avec une manière plus simple en utilisant org.jsonlib. Faites simplement une approche très simple comme ci-dessous:

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

Maintenant, objc'est votre JSONObjectforme convertie de votre chaîne respective. C'est le cas si vous avez des paires nom-valeur.

Pour une chaîne, vous pouvez directement passer au constructeur de JSONObject. Si ce sera valide json String, alors d'accord, sinon, cela lèvera une exception.

TheLittleNaruto
la source
Faire littéralement ce que vous avez écrit: user.put("email", "[email protected]")déclenche une exception non gérée.
Sebastialonso
1
@Sebastialonso Oui, vous devez intercepter l'exception. Comme ceci:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto
@vidya Non, ce n'est pas le cas. Pensez à le comparer à nouveau.
TheLittleNaruto
@vidya Sure Dude
TheLittleNaruto