发送和parsingJSON对象

我想以JSON对象的forms向服务器发送消息,并parsing来自服务器的JSON响应。

我想到了服务器响应的格式:

{ "post": { "username": "someusername", "message": "this is a sweet message", "image": "http://localhost/someimage.jpg", "time": "present time" } } 

我应该有多lessJSON的知识才能达到这个目的? 另外,如果有人能够提供一些用于发送和parsingJSON对象的教程的链接,那将是非常好的。

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

  • GSON
  • jackson

所以你可以绑定到你自己的POJO,而不是一些半棵树节点或列表和地图。 (至lessjackson允许绑定到这样的事情(也许GSON以及不确定),JsonNode,地图,列表,如果你真的想要这些,而不是“真正的”对象)

编辑19-MAR-2014:

另一个新的竞争者是Jackson jr library:它使用与Jackson( jackson-core )相同的快速Streamingparsing器/生成器,但数据绑定部分很小(50kB)。 function比较有限(没有注释,只是普通的Java Beans),但是性能方面应该很快,初始化(first-call)的开销也很低。 所以它可能是不错的select,特别是对于小型应用程序。

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

如果数据有一个确定的结构,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(); } } } 

邮政编码

 package com.tut.JSON; public class Post { String message; String time; String username; Bitmap icon; } 

希望它有帮助。

完整解决scheme

这是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,所以build议在这个代码中使用target sdk 21。

JSON并没有什么特别的地方。 大括号是“对象”(关联数组),方括号是没有键(数字索引)的数组。 至于在Android中使用它,有准备好的课程,包括在SDK(无需下载)。

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

其他答案已经注意到Jackson和GSON(这是Android上stream行的附加JSON库)和json.org(包含在Android中的裸机JSON包)。

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

这被添加到蜂窝:API级别11。

这包括
– android.util.JsonReader: docs和源码
– android.util.JsonWriter: docs和源码

我还会添加一个额外的考虑,推动我回到jackson和GSON:我发现使用第三方库而不是android。*包是有用的,因为那么我写的代码可以在客户端和服务器之间共享。 这对于像JSON这样的东西来说尤其相关,在这种情况下,您可能希望将数据序列化到JSON的一端以发送到另一端。 对于这样的用例,如果你在两端使用Java,有助于避免引入android。*依赖。

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

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

如果你正在寻找快速jsonparsing在android比我build议你一个免费的工具。

JSON类创build器工具

它是免费使用,它是在一秒钟内创build你所有的jsonparsing类..:D

虽然已经有用户提供了很好的答案,比如鼓励使用GSON等。我想build议使用org.json 。 它包含了大部分的GSONfunction。 它也允许你将JSONstring作为parameter passing给它的JSONObject,并且它会处理其余的事情,例如:

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

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

你只需要导入这个

  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(); 

设置输出stream

  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; 

这里的string被构造

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

我使用这个日志来看看它在响应中提供了什么

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

使用包含服务器响应的string实例化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; } 

有不同的开源库,你可以用它来parsingjson。

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

 JSONObject jsonObj = new JSONObject(<jsonStr>); 

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

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

你可以在这里看到完整的例子

jackson的数据绑定: –如果你想绑定和parsing你的json到特定的POJO类,那么你可以使用jackson-databind库,这将绑定你的json到POJO类: –

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

你可以在这里看到完整的例子