发送和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);
你可以在这里看到完整的例子