如何正确生成 JsonArray?

Posted

技术标签:

【中文标题】如何正确生成 JsonArray?【英文标题】:How to generate JsonArray correctly? 【发布时间】:2020-01-08 18:55:59 【问题描述】:

我正在 android studio 中开发一个 java 应用程序,并在 java、netbeans 中开发一个 Rest web 服务器。

我需要向服务器发送一个 JSON ... 我做了整个 webService 引擎并使用 Postman 对其进行了测试。

使用的 Json 是这样的:


    "id":0,
    "ticket":"2132158645161654561651616",
    "avaliacoes":[
        
        "idAvaliacao":1,
        "nota":5,
        "observacao":"testeTEste"
        ,
        
        "idAvaliacao":2,
        "nota":4,
        "observacao":"testeTEste"
        
    ]

完美运行。

于是我就去应用中动态生成Json:

public void enviaDadosVenda()
        JSONObject obj = new JSONObject();
        JSONArray avaliacoes = new JSONArray();
        JSONObject avaliacao;

        try 
            obj.put("id", 0);
            obj.put("ticket", PrincipalActivity.ticket_id);

            for(int i=0; i < PrincipalActivity.listAval.size();i++)
                avaliacao = new JSONObject();
                avaliacao.put("idAvaliacao", listAval.get(i).getId());
                avaliacao.put("nota", listAval.get(i).getNota());
                avaliacao.put("observacao", listAval.get(i).getObservacoes());
                avaliacoes.add(avaliacao);

            

            obj.put("avaliacoes", avaliacoes);

         catch (JSONException e) 
            e.printStackTrace();
        

生成的Json是这样的:


    "id":0,
    "ticket":"2132158645161654561651616",
    "avaliacoes":"[
        
            \"idAvaliacao\":1,
            \"nota\":5,
            \"observacao\":\"testeTEste\"
        ,
        
            \"idAvaliacao\":2,
            \"nota\":4,\"observacao\":\"testeTEste\"
        
    ]"

如果我在 Postman 上使用这第二个 Json,webService 不会正确获取它。

获取 id 和票证,但评估数组获取单个项目(avaliacoes.get(0)) = null。

我查看了有关 Json 和 ArrayJsons 的其他帖子,但没有任何帮助...

Parsing JSON Object in Java

Convert JsonObject to String

How to create correct JSONArray in Java using JSONObject

https://pt.***.com/questions/140442/reconhecer-um-jsonobject-ou-jsonarray

【问题讨论】:

使用Gson库生成json。 这是从 Android 引用 org.json.JSONArray 吗?如果是这样,会不会是avaliacoes.put(avaliacao); 而不是.add?看来您的 JSONArray 被视为字符串(而不是正确的 org.json.JSONArray)并且被错误地序列化 【参考方案1】:

只需将avaliacoes.add(avaliacao); 替换为avaliacoes.put(avaliacao);

public void enviaDadosVenda()
        JSONObject obj = new JSONObject();
        JSONArray avaliacoes = new JSONArray();
        JSONObject avaliacao;

        try 
            obj.put("id", 0);
            obj.put("ticket", "DemoActivity.ticket_id");

            for(int i=0; i < 2;i++)
                avaliacao = new JSONObject();
                avaliacao.put("idAvaliacao", "1");
                avaliacao.put("nota", "nota");
                avaliacao.put("observacao", "observacao");
                avaliacoes.put(avaliacao);

            
            obj.put("avaliacoes", avaliacoes);
            Log.d("DEMO", obj.toString());  // "id":0,"ticket":"DemoActivity.ticket_id","avaliacoes":["idAvaliacao":"1","nota":"nota","observacao":"observacao","idAvaliacao":"1","nota":"nota","observacao":"observacao"]

         catch (JSONException e) 
            e.printStackTrace();
        
    

最佳实践使用Gson

【讨论】:

以上是关于如何正确生成 JsonArray?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSONObject 在 Java 中创建正确的 JSONArray

解析嵌套的 JSONArray 并以 Recyclerview 正确的方式显示它

JSONArray的使用

JSONArray 与 List 互转

如何获取jsonarray中 某个值

'object' is an array. Use JSONArray instead