在 Android 中发送和解析 JSON 对象 [关闭]

Posted

技术标签:

【中文标题】在 Android 中发送和解析 JSON 对象 [关闭]【英文标题】:Sending and Parsing JSON Objects in Android [closed] 【发布时间】:2011-02-18 14:36:03 【问题描述】:

我想以 JSON 对象的形式向服务器发送消息并解析来自服务器的 JSON 响应。

JSON 对象示例


  "post": 
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  

我正在尝试通过逐个属性手动解析 JSON。有没有我可以使用的库/实用程序来简化这个过程?

【问题讨论】:

该网址不再可用...您能更新一下吗? 这里有一个详细的例子:android – JSON Parsing example @Paresh Mayani & @primpap .. 我知道我们可以使用 get 方法从服务器接收的 JSON 填充来自服务器的数据,我很满意....但是如果我们使用post 方法将数据发送到服务器,我们是否再次将数据作为 JSON 发送,我指的是 primpap 问题的引用“我想以 JSON 对象的形式将消息发送到 Django 服务器”.....我我在服务器上使用 mysql .... 还是我发送 JSON 对象? ...您能否向我澄清此信息....或任何有助于我理解该概念的链接都会有所帮助,谢谢 【参考方案1】:

如果数据有明确的结构,GSON 是最容易使用的方法。

下载gson。

将其添加到引用的库中。

package com.tut.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class SimpleJson extends Activity 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String jString = "\"username\": \"tom\", \"message\": \"roger that\"  ";


        GsonBuilder gsonb = new GsonBuilder();
        Gson gson = gsonb.create();
        Post pst;

        try 
            pst = gson.fromJson(jString,  Post.class);

         catch (JSONException e) 
            e.printStackTrace();
        
    

Post 类代码

package com.tut.JSON;

public class Post 

    String message;
    String time;
    String username;
    Bitmap icon;

【讨论】:

为了它的价值,代码可以被简化:JSONObject 转换是不必要的。而setter和getter对于GSon来说是可选的;可以根据需要添加,但不是绝对必要的。 只是为了澄清 StaxMan 的评论。您的示例采用 jString,将其转换为 JSONObject,然后将其转换回字符串以供 gson 读取。只需使用 pst = gson.fromJson(jString, Post.class)。我相信这也将摆脱对 try-catch 的需要。正如 StaxMan 还指出的那样, Post.class 中的 setter 和 getter 没有任何价值。纠正您的示例对其他人会有所帮助。 我从答案中删除了双重转换部分【参考方案2】:

有不同的开源库,您可以使用它们来解析 json。

org.json :- 如果你想读取或写入 json,那么你可以使用这个库。 首先创建 JsonObject :-

JSONObject jsonObj = new JSONObject(<jsonStr>);

现在,使用这个对象来获取你的值:-

String id = jsonObj.getString("id");

你可以看到完整的例子here

Jackson databind :- 如果你想将你的 json 绑定并解析到特定的 POJO 类,那么你可以使用 jackson-databind 库,这会将你的 json 绑定到 POJO 类:-

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

你可以看到完整的例子here

【讨论】:

【参考方案3】:

你只需要导入这个

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

我使用两个对象,因为你可以在另一个对象中有一个 jsonObject

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

然后我把post json放在另一个这样的里面

  param.put("post",post);

这是我用来发出请求的方法

 makeRequest(param.toString());

public JSONObject makeRequest(String param)

    try
    

设置连接

        urlConnection = new URL("your url");
        connection = (HttpURLConnection) urlConnection.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
        connection.setReadTimeout(60000);
        connection.setConnectTimeout(60000);
        connection.connect();

设置输出流

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

我用它在 logcat 中查看我发送的内容

        Log.d("OUTPUT STREAM  " ,param);
        dataOutputStream.writeBytes(param);
        dataOutputStream.flush();
        dataOutputStream.close();

        InputStream in = new BufferedInputStream(connection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        result = new StringBuilder();
        String line;

这里构造了字符串

        while ((line = reader.readLine()) != null)
        
            result.append(line);
        

我使用这个日志来查看响应中的内容

         Log.d("INPUTSTREAM: ",result.toString());

使用包含服务器响应的字符串实例化一个 json

        jResponse=new JSONObject(result.toString());

    
    catch (IOException e) 
        e.printStackTrace();
        return jResponse=null;
     catch (JSONException e)
    
        e.printStackTrace();
        return jResponse=null;
    
    connection.disconnect();
    return jResponse;

【讨论】:

提前感谢您的宝贵时间。我使用您的代码将 base64 编码的字符串发送到 django 服务器,但是当我单击按钮发送到服务器时,APP 崩溃了。你能帮我解决这个问题吗?【参考方案4】:

这是 JsonParser 类

public class JSONParser 

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() 

    

    public JSONObject getJSONFromUrl(String url) 

        // Making HTTP request
        try 
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

         catch (UnsupportedEncodingException e) 
            e.printStackTrace();
         catch (ClientProtocolException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        

        try 
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) 
                sb.append(line + "\n");
            
            is.close();
            json = sb.toString();
         catch (Exception e) 
            Log.e("Buffer Error", "Error converting result " + e.toString());
        

        // try parse the string to a JSON object
        try 
            jObj = new JSONObject(json);
         catch (JSONException e) 
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        

        // return JSON String
        return jObj;

    

注意:sdk 23 不再支持 DefaultHttpClient,因此建议在此代码中使用目标 sdk 21。

【讨论】:

【参考方案5】:

尽管用户已经提供了很好的答案,例如鼓励使用 GSON 等。我想建议使用org.json。它包括大部分 GSON 功能。它还允许您将 json 字符串作为参数传递给它的 JSONObject,它会处理其余部分,例如:

JSONObject json = new JSONObject("some random json string");

这个功能使它成为我个人的最爱。

【讨论】:

【参考方案6】:

我很惊讶这些没有被提及:但是 GSon 和 Jackson 使用起来更方便,而不是使用 json.org 的小包的简单的手动过程。所以:

GSON Jackson

因此,您实际上可以绑定到自己的 POJO,而不是一些半途而废的树节点或列表和映射。 (至少 Jackson 也允许绑定到这些东西(也许 GSON 也可以,不确定)、JsonNode、Map、List,如果你真的想要这些而不是“真实”对象)

2014 年 3 月 19 日编辑:

另一个新的竞争者是Jackson jr 库:它使用与 Jackson (jackson-core) 相同的快速流解析器/生成器,但数据绑定部分很小 (50kB)。功能更受限制(没有注释,只有常规 Java Bean),但性能方面应该很快,初始化(第一次调用)开销也非常低。 所以它可能是一个不错的选择,尤其是对于较小的应用程序。

【讨论】:

GSON +1。我们在 Android 应用中特别使用了 GSON 的流媒体支持 sites.google.com/site/gson/streaming。 FWIW,Jackson 也有流媒体 API:wiki.fasterxml.com/JacksonStreamingApi 对于 GSON 流媒体也是 +1。最初实现了 Jackson 流,但尽管在调试版本中起作用,ProGuard 产生了大量错误,并且发布版本导致难以追踪的崩溃。我确信这与 Jackson 无关,但它让我改用 GSON,它工作得很好,只需要额外的 14kB 就可以流式传输。 对于愚蠢的不可预测的 json 混合字符串和列表例如:["toto", "tata", ["monty", ["tor", "python"]]]? (一种需要递归函数来使用它的数据结构)【参考方案7】:

如果您正在寻找 android 中的快速 json 解析,那么我建议您使用免费提供的工具。

JSON Class Creator tool

它是免费使用的,它可以在一两秒内创建你所有的 json 解析类.. :D

【讨论】:

【参考方案8】:

其他答案提到了 Jackson 和 GSON - 适用于 Android 的流行附加 JSON 库,以及 json.org,Android 中包含的基本 JSON 包。

但我认为还值得注意的是,Android 现在拥有自己的全功能 JSON API。

这是在 Honeycomb:API 级别 11 中添加的。

这包括 - android.util.JsonReader:docs 和 source - android.util.JsonWriter:docs,和source

我还将添加一个额外的考虑因素,让我回到 Jackson 和 GSON:我发现使用 3rd 方库而不是 android.* 包很有用,因为这样我编写的代码可以在客户端和服务器之间共享。这与 JSON 之类的东西特别相关,您可能希望在一端将数据序列化为 JSON 以发送到另一端。对于这样的用例,如果您在两端都使用 Java,则有助于避免引入 android.* 依赖项。

或者我想可以获取相关的 android.* 源代码并将其添加到您的服务器项目中,但我还没有尝试过...

【讨论】:

【参考方案9】:

JSON 没有任何意义。花括号用于“对象”(关联数组),方括号用于没有键的数组(数字索引)。至于在 Android 中使用它,SDK 中包含了现成的类(无需下载)。

查看这些课程: http://developer.android.com/reference/org/json/package-summary.html

【讨论】:

我想你的意思是花括号而不是尖括号!【参考方案10】:

您可以使用org.json.JSONObject 和org.json.JSONTokener。您不需要任何外部库,因为这些类随 Android SDK 提供

【讨论】:

糟糕!我错过了。事实上,它们就是网站上的 org.json 库。 这是我使用的,它就像一个魅力。 如果能给出一个例子或链接就太好了。这样更容易学习。 :) 来自谷歌:java.sun.com/developer/technicalArticles/javame/json-me 更方便,编写代码更少:一两行而不是几十行。【参考方案11】:

您可以从http://json.org(Json-lib 或 org.json)下载一个库并使用它来解析/生成 JSON

【讨论】:

以上是关于在 Android 中发送和解析 JSON 对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android 中解析 JSON

如何仅将一些选定的 Json 数组和 Json 对象从 Url 解析到 android 设备

如何在 Android 中解析 JSON 对象

如何在 Android 中解析 JSON 数组(不是 Json 对象)

在 Android 中解析嵌套的 JSON 对象

使用 gson 解析成 POJO 时,Json 总是返回 null