wake-up-neo.net

Wie lege ich das Objekt richtig in JSONObject ab?

Ich versuche mein JSONObject so zu füllen:

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

user ist eine Instanz der Basisklasse, die Felder wie "FirstName", "LastName" usw. enthält.

Anscheinend mache ich es falsch, weil ich JSON so bekomme:

{
    "Command":"CreateNewUser",
    "User":"[email protected]"
}

statt "Baum". 

Was stimmt nicht mit meinem Code?

10
Kamil

Da Sie JSONObject zur Darstellung von nicht primitiven Typen verwenden, werden alle an JSONObject.put(Object, Object) übergebenen Instanzen verschachtelte Elemente (oder trees ) generiert.

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

Das von Ihnen verwendete Framework weiß nicht, wie Sie Ihr Benutzerobjekt in eine Map konvertieren, die intern als JSON-Darstellung verwendet wird, und verwendet daher die standardmäßige 'toString'-Methode, die Sie nicht überschreiben.

Exportieren Sie einfach alle Eigenschaften Ihres Benutzers (z. B. die Schreibmethode 'Map toMap ()' auf Ihren Benutzertyp) in eine Map (alle Werte müssen Standard-JDK-Typen sein) und fügen Sie diese Map in Ihr json-Objekt ein:

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

Es wird das Ding machen.

3
Rafal G.

Das wird tun, was Sie wollen!

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

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

 public JSONObject put (String name, Object value)

Parameter Wert ein JSONObject, JSONArray, String, Boolean, Integer, Long, Double, NULL oder NULL. Darf nicht NaN oder Unendlichkeit sein.

Obwohl Ihre user eine Unterklasse von Object ist, erwartet die put-Methode nicht den Typ. 

Die Implementierung von JSONObject für das Android-SDK scheint keine put(Java.lang.String key, Java.util.Map value)-Methode zu haben (über denselben Link oben). Sie müssen möglicherweise eine Methode toMap() in Ihrer user-Klasse hinzufügen, um sie in eine HashMap-Datei zu konvertieren. Dann benutzen Sie schließlich json.put("user", new JSONObject(user.toMap()));

0
user2829759

Sie können das Problem mit dem fastenxx ObjectMapper lösen.

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

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

Sie erhalten folgende Ausgabe:

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

Ref: https://github.com/FasterXML/jackson-databind/

0
Kevindra