web-dev-qa-db-fra.com

Décodage de la chaîne JSON en Java

Je suis novice dans l'utilisation de la bibliothèque json-simple dans Java et j'ai parcouru à la fois les échantillons encodage et décodage . Duplication de la les exemples de codage étaient corrects, mais je n'ai pas réussi à faire fonctionner les décodeurs avec le type mixte JSON.

Un de mes problèmes est qu'il y a trop de classes dans la bibliothèque qui ne sont pas correctement documentées et dont je n'ai pas la source (afin de pouvoir lire et comprendre leur but). Par conséquent, j'ai du mal à comprendre comment utiliser beaucoup de ces classes.

Après avoir lu cet exemple:

String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}";
JSONParser parser = new JSONParser();

ContainerFactory containerFactory = new ContainerFactory(){
    public List creatArrayContainer() {
        return new LinkedList();
    }

    public Map createObjectContainer() {
        return new LinkedHashMap();
    }                     
};

try {
    Map json = (Map)parser.parse(jsonText, containerFactory);
    Iterator iter = json.entrySet().iterator();
    System.out.println("==iterate result==");

    while(iter.hasNext()) {
        Map.Entry entry = (Map.Entry)iter.next();
        System.out.println(entry.getKey() + "=>" + entry.getValue());
    }

    System.out.println("==toJSONString()==");
    System.out.println(JSONValue.toJSONString(json));
} catch(ParseException pe) {
    System.out.println(pe);
}

du tutoriel de décodage officiel json-simple , j'ai essayé de décoder ce JSON:

{
"stat":{
    "sdr": "MAC address of FLYPORT",
    "rcv": "ff:ff:ff:ff:ff:ff",
    "time": "0000000000000",
    "type": 0,
    "subt": 0,
    "argv": [
        {"type": "6","val": "NetbiosName"},
        {"type": "6","val": "MACaddrFlyport"},
        {"type": "6","val": "FlyportModel"},
        {"type": "1","val": id}
    ]
}
}

J'écris le code suivant pour décoder:

    String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{1,2},{2,3}]}}";
    JSONObject jsonObject = new JSONObject(jsonString);
    JSONObject newJSON = jsonObject.getJSONObject("stat");
    System.out.println(newJSON);

Mais ça ne marche pas. En fait, je n'ai pas pu non plus faire fonctionner l'exemple non modifié, et les auteurs originaux n'ont pas expliqué leur code.

Quelle est la façon la plus simple de décoder ce JSON comme indiqué?

16
Sharda Singh

Voici le code le meilleur et le plus simple:

public class test
{
    public static void main(String str[])
    {
        String jsonString = "{\"stat\": { \"sdr\": \"aa:bb:cc:dd:ee:ff\", \"rcv\": \"aa:bb:cc:dd:ee:ff\", \"time\": \"UTC in millis\", \"type\": 1, \"subt\": 1, \"argv\": [{\"type\": 1, \"val\":\"stackoverflow\"}]}}";
        JSONObject jsonObject = new JSONObject(jsonString);
        JSONObject newJSON = jsonObject.getJSONObject("stat");
        System.out.println(newJSON.toString());
        jsonObject = new JSONObject(newJSON.toString());
        System.out.println(jsonObject.getString("rcv"));
       System.out.println(jsonObject.getJSONArray("argv"));
    }
}

Les la définition de la bibliothèque des fichiers json est donnée ici . Et ce ne sont pas les mêmes bibliothèques que celles publiées ici , c'est-à-dire publiées par vous. Ce que vous aviez publié était bibliothèque json simple J'ai utilisé cette bibliothèque .

Vous pouvez télécharger le Zip . Et puis créez un package dans votre projet avec org.json comme nom. et collez-y tous les codes téléchargés, et amusez-vous.

Je pense que c'est le meilleur et le plus simple décodage JSON.

23
Veer Shrivastav

Eh bien, votre jsonString est faux.

String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{\"1\":2},{\"2\":3}]}}";

utilisez ce jsonString et si vous utilisez les mêmes JSONParser et ContainerFactory dans l'exemple, vous verrez qu'il sera encodé/décodé.

De plus, si vous souhaitez imprimer votre chaîne après stat, voici:

     try{
        Map json = (Map)parser.parse(jsonString, containerFactory);
        Iterator iter = json.entrySet().iterator();
        System.out.println("==iterate result==");
        Object entry = json.get("stat");
        System.out.println(entry);
      }

Et à propos des bibliothèques json, il y en a beaucoup. Mieux vaut vérifier ceci .

4
anvarik

Au lieu de télécharger des fichiers Java Java comme suggéré par Veer, vous pouvez simplement ajouter ceci fichier JAR à votre package.

Pour ajouter le fichier jar à votre projet dans Eclipse, procédez comme suit:

  1. Faites un clic droit sur votre projet, cliquez sur Build Path> Configure Build Path
  2. Aller à l'onglet Bibliothèques> Ajouter des fichiers JAR externes
  3. Localisez le fichier JAR et ajoutez
3
Afreen

Voici la chaîne JSON que nous voulons décoder:

{ 
   "stats": { 
       "sdr": "aa:bb:cc:dd:ee:ff", 
       "rcv": "aa:bb:cc:dd:ee:ff", 
       "time": "UTC in millis", 
       "type": 1, 
       "subt": 1, 
       "argv": [
          {"1": 2}, 
          {"2": 3}
       ]}
}

Je stocke cette chaîne sous le nom de variable "sJSON" Maintenant, voici comment la décoder :)

// Creating a JSONObject from a String 
JSONObject nodeRoot  = new JSONObject(sJSON); 

// Creating a sub-JSONObject from another JSONObject
JSONObject nodeStats = nodeRoot.getJSONObject("stats");

// Getting the value of a attribute in a JSONObject
String sSDR = nodeStats.getString("sdr");
2
alphayax