我想以JSON对象的形式向服务器发送消息,并从服务器解析JSON响应。
JSON对象的示例
{
"post": {
"username": "John Doe",
"message": "test message",
"image": "image url",
"time": "current time"
}
}
我试图通过逐个属性来手动解析JSON。我可以使用任何库/实用程序来简化此过程吗?
答案 0 :(得分:118)
我很惊讶这些没有被提及:但是使用json.org的小包装而不是使用简单的手动过程,GSon和Jackson使用起来更方便。所以:
因此,您实际上可以绑定到您自己的POJO,而不是一些半assed树节点或列表和地图。 (并且至少杰克逊允许绑定到这样的东西(也许是GSON,也不确定),JsonNode,Map,List,如果你真的想要这些而不是'真正的'对象)
2014年3月19日编辑:
另一个新的竞争者是Jackson jr库:它使用与Jackson(jackson-core
)相同的快速流式解析器/生成器,但数据绑定部分很小(50kB)。功能更加有限(没有注释,只有普通的Java Bean),但性能方面应该很快,初始化(首次调用)开销也很低。
所以它可能是一个不错的选择,特别是对于较小的应用程序。
答案 1 :(得分:85)
您可以使用org.json.JSONObject和org.json.JSONTokener。您不需要任何外部库,因为这些类附带Android SDK
答案 2 :(得分:30)
如果数据具有明确的结构,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 class的代码
package com.tut.JSON;
public class Post {
String message;
String time;
String username;
Bitmap icon;
}
答案 3 :(得分: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。
答案 4 :(得分:3)
JSON没什么。圆括号用于“对象”(关联数组),方括号用于没有键的数组(数字索引)。至于在Android中使用它,有一些现成的类包含在sdk中(不需要下载)。
查看这些课程: http://developer.android.com/reference/org/json/package-summary.html
答案 5 :(得分:2)
其他答案已经注意到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:我发现使用第三方库而不是android。*包很有用,因为我编写的代码可以在客户端和服务器之间共享。这对于像JSON这样的东西尤其重要,在这种情况下,您可能希望在一端将数据序列化为JSON以发送到另一端。对于这样的用例,如果你在两端都使用Java,那么有助于避免引入android。*依赖。
或者我想可以抓住相关的android。*源代码并将其添加到您的服务器项目中,但我还没试过......
答案 6 :(得分:1)
您可以从http://json.org(Json-lib或org.json)下载库并使用它来解析/生成JSON
答案 7 :(得分:1)
你只需要导入这个
import org.json.JSONObject;
constructing the String that you want to send
JSONObject param=new JSONObject();
JSONObject post=new JSONObject();
我正在使用两个对象,因为你可以在另一个
中有一个jsonObjectpost.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");
然后我将帖子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());
使用包含服务器响应的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;
}
答案 8 :(得分:0)
答案 9 :(得分:0)
尽管用户已经提供了很好的答案,例如鼓励使用GSON等。我想建议使用org.json。它包括大多数GSON功能。它还允许您将json字符串作为参数传递给它的JSONObject,它会处理休息,例如:
bar
此功能使其成为我个人的最爱。
答案 10 :(得分:0)
有不同的开源库,您可以使用它们来解析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