web-dev-qa-db-fra.com

Comment mettre un objet dans JSONObject correctement?

J'essaie de remplir mon JSONObject comme ceci:

JSONObject json = new JSONObject();
json.put("Command", "CreateNewUser");
json.put("User", user);

user est une instance d'une classe de base contenant des champs tels que "Prénom", "Nom", etc.

On dirait que je me trompe, parce que JSON ressemble à ceci:

{
    "Command":"CreateNewUser",
    "User":"my.package.name.classes.User@2686a150"
}

au lieu de "arbre". 

Quel est le problème avec mon code?

10
Kamil

Puisque vous utilisez JSONObject pour représenter des types non primitifs, toute instance passée à JSONObject.put(Object, Object) générera des éléments imbriqués (ou trees ).

JSONObject main = new JSONObject();
main.put("Command", "CreateNewUser");
JSONObject user = new JSONObject();
user.put("FirstName", "John");
user.put("LastName", "Reese");
main.put("User", user);
{
    "User": {
        "FirstName": "John",
        "LastName": "Reese"
    },
    "Command": "CreateNewUser"
}
24

Le framework que vous utilisez ne sait pas comment convertir votre objet User en Map, utilisé en interne en tant que représentation JSON. Il utilise donc la méthode standard 'toString' que vous n'avez pas remplacée.

Exportez simplement toutes les propriétés (par exemple, la méthode d'écriture 'Map toMap ()' sur votre type d'utilisateur) de votre utilisateur vers une carte (toutes les valeurs doivent être des types JDK standard) et placez cette carte dans votre objet json:

json.put("User", user.toMap())

Cela fera l'affaire.

3
Rafal G.

Cela fera ce que vous voulez!

JSONObject json = new JSONObject();
json.put("Command", "CreateNewUser");
json.put("User", new JSONObject(user));
3
Hrant Vardanyan

De http://developer.Android.com/reference/org/json/JSONObject.html#put

 public JSONObject put (String name, Object value)

Paramètres value a JSONObject, JSONArray, String, Boolean, Integer, Long, Double, NULL ou null. Ne peut être ni NaN ni infini.

Bien que votre user soit une sous-classe de Object, ce n'est pas le type attendu par la méthode put

L'implémentation de JSONObject dans le SDK Android semble manquer d'une méthode put(Java.lang.String key, Java.util.Map value) (à partir du même lien ci-dessus). Vous devrez peut-être ajouter une méthode toMap() dans votre classe user pour la convertir en HashMap. Enfin, utilisez json.put("user", new JSONObject(user.toMap()));

0
user2829759

Vous pouvez le résoudre en utilisant plus rapide ObjectMapper.

ObjectMapper o = new ObjectMapper();
String userJsonString = o.readValueAsString(user);

JSONObject jsonObj = new JSONObject();
jsonObj.put("Command", "CreateNewUser");
jsonObj.put("User", new JSONObject(userJsonString));

Vous obtiendrez la sortie suivante:

{
    "User": {
        "FirstName": "John",
        "LastName": "Reese"
    },
    "Command": "CreateNewUser"
}

Réf.: https://github.com/FasterXML/jackson-databind/

0
Kevindra