使用json.simple创建json对象

ant2009

我正在使用以下库来创建一些JSON对象。

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

我想创建的json是这样的:

{
    "function": "create_contact_group",
    "parameters": [{
        "user_id": "teer",
        "comp_id": "97",
        "contact_group_name": "Test01",
        "invite_user_list": [{
            "invite_user_id": "steve"
        }]

    }]
}

我的函数看起来像这样:

public JSONObject createJSONRequest() {
    /* Create json object */
    JSONObject jsonObject = new JSONObject();

    Map<String, String> map = new HashMap<>();
    map.put("user_id", "teer");
    map.put("comp_id", "97");
    map.put("contact_group_name", "Test01");

    List<String> mInviteUserList = new ArrayList<>();
    mInviteUserList.add("steve");

    /* Create the list of invitee */
    Map<String, String> inviteList = new HashMap<>();
    for(String user : mInviteUserList) {
        inviteList.put("invite_user_id", user);
    }
    /* Add the invitees into the json array */
    JSONArray inviteArray = new JSONArray();
    inviteArray.add(inviteList);
    /* Add the json array to the json object */
    jsonObject.put("invite_user_list", inviteArray);

    JSONArray parameterlist = new JSONArray();
    parameterlist.add(map);
    parameterlist.add(jsonObject);

    jsonObject.put("parameters", parameterlist);
    jsonObject.put("function", "create_contact_group");

    Log.d(TAG, "jsonObject: " + jsonObject.toJSONString());

    return jsonObject;
}

但是,当我到达以下行时,该函数崩溃:

Log.d(TAG, "jsonObject: " + jsonObject.toJSONString())

我认为这与以下这条线有关:

parameterlist.add(jsonObject);

堆栈跟踪:

java.lang.StackOverflowError java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:132)at java.lang.StringBuffer.append(StringBuffer.java:126)at org.json.simple.JSONObject.toJSONString(JSONObject.java:116)上的org.json.simple.JSONValue.escape(JSONValue.java:266)

非常感谢您的任何建议,

吉特

您的代码中有几个问题。一个问题是,您在Java代码中创建的结构与上面显示的结构不匹配。我将在下面对此进行描述。第二个问题是您遇到了stackoverflow异常(您知道但不知道为什么)。

由于程序耗尽了计算机分配的堆栈内存,引发了stackoverflow异常。你为什么问?好吧,因为您创建了一个递归或循环JSON对象。这不是很好,但没什么大不了的,因为它很容易解决。那么,为什么程序会抛出此异常?好吧,请看下面的代码片段:

JSONArray parameterlist = new JSONArray();
parameterlist.add(map);
parameterlist.add(jsonObject);

jsonObject.put("parameters", parameterlist);
jsonObject.put("function", "create_contact_group");

您创建一个JSONArray,然后将JSONObject之前创建的添加到数组中。之后,将相同的数组添加到该数组中已存在的对象中。我希望您看到与此有关的问题!

因此,不应该这样做。以及如何解决这个问题?好吧,我认为更好地描述了您应该如何编写代码以获取实际需要的结构,所以我会尝试这样做...

该怎么办...?

始终使用以下类型的括号声明JSON(JavaScript对象表示法)对象:{}具有的JSON数组[],因此,您尝试生成的JSON应采用以下数据类型:

{  // <= Root object (a JSON-object).
    "function": "create_contact_group", // <= Key in the root-object (where the key is a string and the value a string)
    "parameters": [ // <= Key in the root-object (where the key is a string and the value is an array.
        {  // <= Object inside the array.
            "user_id": "teer", // Key (string/string)
            "comp_id": "97",   // Key (string/string)
            "contact_group_name": "Test01", // Key (string/string)
            "invite_user_list": [  // Key (string/array)
                {   // Object inside the invite_user_list array
                    "invite_user_id": "steve"  // Key (string/string)
                }
            ]
        }
    ]
}

因此,在Java中创建JSON对象时,您需要创建一个根对象,然后在其中添加所有diff参数。使用JSONObject.put(string, Object)方法完成将值添加到JSONObject的操作,其中字符串是键,而对象是值。

因此,我建议创建参数列表。在您的情况下,您将aHashMap用作对象,这并不是真的错误,但也没有必要,我只是坚持使用JSONObject,它与a并没有什么不同HashMap<string, Object>因此map.put(...),除了,您可以执行以下操作:

JSONObject param = new JSONObject();
param.put("user_id", "teer");
param.put("comp_id", "97");
param.put("contact_group_name", "Test01");

现在,对象值之一应该是数组(invite_user_id),将数组添加到对象的最简单方法是创建一个JSONArray,然后将其添加。

JSONArray inviteList = new JSONArray();
// Then you need to add an object to the array for each `user` that has invited.
// For-loop here maybe?
JSONObject invitee = new JSONObject();
invitee.put("invite_user_id", user);
inviteList,add(invitee); // This will make it into an array with objects, I.E., [ { "invite_user_id": "Steve" } ]

创建邀请列表后,将其添加到param对象中,如下所示:

param.put("invite_user_list", inviteList);
// Now, param should be in its own list too, so you should probably create a JSONArray for the params.
// Ill leave that to you, and we pretend we have a list of the param objects named "params".

然后,最后,创建根对象并设置其值:

JSONObject root = new JSONObject();
root.put("parameters", params);
root.put("function", "create_contact_group");

就是这样。

这应该使用上面创建的结构创建一个JSON字符串。但是我建议为此进行测试(和编写单元测试!)(尤其是在浏览器中编写了这段代码!)。

但为什么?!

我想我应该尝试描述为什么您的代码无法像我上面描述的那样工作。

首先创建一个根对象,到目前为止,一切都很好(可以在开始时或需要时创建它,这并不重要),然后创建一个HashMap并向其中添加属性。到目前为止,这也是合法的(您可以稍后JSONObject在地图上创建一个)。

在下一部分中,您将创建一个ArrayList(我不太确定为什么)并为其添加一个名称,然后在for循环中创建另一个HashMap名称(将单个名称添加至(key invite_user_list))。
这不是必需的(仅是一个名称),就是错误的(如果在现实生活中应该在代码中执行更多的名称),在不必要的情况下,for循环不应该存在,以防万一。的“不像现实生活”,它不应该添加到地图中!
相反,invieList应该是一个数组,并且添加的每个条目都应该是一个将“ invite_user_id”键设置为名称的对象。

在那之后,您将邀请列表添加HashMap到一个新创建的JSONArray,我想这可能还可以,如果您只想要数组中的一个对象,否则我建议您在循环之前创建它,并将每个条目添加到其中!
然后,使用key将vitalArray放入根对象中,然后invite_user_list创建另一个对象,JSONArray并添加map(首先创建的参数)和首先创建的JSONObject(根)。
但是,此后要做的事情就是为什么要得到stackoverflow异常,然后将parameterlist(包含jsonObject(根))添加到jsonObject,这使得jsonObject存在于自身内部的数组中!
这将创建一个循环JSON结构,如果要展开整个对象,该结构将永远不会结束,因此计算机将引发异常。

结果对象的结构也将是错误的,因为它看起来像这样:

{ // Root (jsonObject)
    "invite_user_list": [
        { "invite_user_id": "steve" }
    ]
    "parameters": [
        { // The "map" hashmap
            "user_id", "teer",
            "comp_id": "97",
            "contact_group_name": "Test01"
        },
        {   // The jsonObject object (which is also the root!)
            "invite_user_list": [
                { "invite_user_id": "steve" }
            ],
            "parameters": [
                { // The "map" hashmap
                    "user_id", "teer",
                    "comp_id": "97",
                    "contact_group_name": "Test01"
                },
                {
                    // The jsonObject object again (which is also the root and the parent!)

                    // ... and so on til eternity!
                }
            ],
            "function": "create_contact_group" 
        }
    ],
    "function": "create_contact_group" 
}

额外的...

我想在此末尾添加(希望您在阅读完我上面写的全部文字后结束,因为您可能已经学到了一些东西!),这是一种更简单的方法。

现在,我自己还没有使用过这个lib,但是据我了解,它应该能够序列化整个对象,该lib可以在Google的github仓库中找到,可以用作json序列化程序并转换一个class-instance转换为json字符串,则可以为整个对象创建一个类,并将其填充并在函数末尾进行序列化,而无需使用JSONArraynor JSONObject

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章