【问题标题】:How to put object into JSONObject properly?如何将对象正确放入 JSONObject?
【发布时间】:2015-07-12 09:51:37
【问题描述】:

我正在尝试像这样填充我的 JSONObject:

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

user 是包含“FirstName”、“LastName”等字段的基本类的实例。

看起来我做错了,因为我得到这样的 JSON:

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

而不是“树”。

我的代码有什么问题?

【问题讨论】:

  • 你用的是什么库?
  • 嗯...根本没有图书馆。我正在使用香草 Android SDK。
  • user 对象返回 java 基本类的覆盖方法 toString() ,返回“Class-Name+@+Hash-Code” ...您需要传递 hashmap 或其他 Collections.. .

标签: java android json


【解决方案1】:

您使用的框架不知道如何将您的用户对象转换为地图,该地图在内部用作 JSON 表示,因此它使用您尚未覆盖的标准“toString”方法。

只需将您的用户的所有属性(例如,在您的用户类型上写入方法'Map toMap()')导出到地图(所有值都必须是标准 JDK 类型)并将该地图放入您的 json 对象中:

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

它会做的事情。

【讨论】:

    【解决方案2】:

    由于您使用JSONObject 表示非原始类型,因此传递给JSONObject.put(Object, Object) 的任何实例都将生成嵌套项(或)。

    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"
    }
    

    【讨论】:

    • 即使 main.put("Command", "CreateNewUser"); 为什么在 "Command" 之前是 "User"出现在 main.put("User", user);
    • @mostvenerablesir 因为per JSON spec,对象是一组无序名称/值对。因此,可以根据需要重新排列元素的顺序。
    • 好的,您只需按照与代码生成的相反的顺序编写即可?
    • @mostvenerablesir 不,这是调用main.toString(4) 的结果。出于性能原因,库本身已重新排列元素的顺序,因为不需要保留它们的插入顺序。
    【解决方案3】:

    来自http://developer.android.com/reference/org/json/JSONObject.html#put

     public JSONObject put (String name, Object value)
    

    参数 值为 JSONObject、JSONArray、String、Boolean、Integer、Long、Double、NULL 或 null。可能不是 NaN 或无穷大。

    虽然您的userObject 的子类,但它不是put 方法所期望的类型。

    JSONObject 的 android SDK 实现似乎缺少 put(java.lang.String key, java.util.Map value) 方法(来自上面的相同链接)。您可能需要在 user 类中添加方法 toMap() 以将其转换为 HashMap。然后最后使用json.put("user", new JSONObject(user.toMap()));

    【讨论】:

    • 这应该是公认的答案。谢谢队友
    【解决方案4】:

    你可以使用fasterxml ObjectMapper解决它。

    ObjectMapper o = new ObjectMapper();
    String userJsonString = o.readValueAsString(user);
    
    JSONObject jsonObj = new JSONObject();
    jsonObj.put("Command", "CreateNewUser");
    jsonObj.put("User", new JSONObject(userJsonString));
    

    你会得到以下输出:

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

    参考:https://github.com/FasterXML/jackson-databind/

    【讨论】:

      【解决方案5】:

      这会做你想要的!

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

      【讨论】:

        猜你喜欢
        • 2013-07-26
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多