我想以JSON对象的形式将消息发送到服务器,并解析来自服务器的JSON响应。
JSON对象的示例
{
"post": {
"username": "John Doe",
"message": "test message",
"image": "image url",
"time": "current time"
}
}
我试图通过逐个属性手动解析JSON。我可以使用任何库/实用工具来简化此过程吗?
我想以JSON对象的形式将消息发送到服务器,并解析来自服务器的JSON响应。
JSON对象的示例
{
"post": {
"username": "John Doe",
"message": "test message",
"image": "image url",
"time": "current time"
}
}
我试图通过逐个属性手动解析JSON。我可以使用任何库/实用工具来简化此过程吗?
Answers:
我很惊讶这些没有被提及:但是,与使用json.org的小程序包进行简单的手工操作相比,GSon和Jackson更为方便。所以:
因此,您实际上可以绑定到自己的POJO,而不是绑定到某些半确定的树节点或列表和地图。(至少杰克逊也允许绑定到这些东西(也许还有GSON,也不确定),如果您真的想要这些而不是“真实的”对象,则可以使用JsonNode,Map,List。
编辑2014年3月19日:
另一个新的竞争者是Jackson jr库:它使用与Jackson(jackson-core
)相同的快速流解析器/生成器,但是数据绑定部分很小(50kB)。功能受到更多限制(没有注释,只有常规的Java Bean),但是性能方面应该很快,并且初始化(首次调用)开销也非常低。因此,这可能是个不错的选择,尤其是对于较小的应用程序。
您可以使用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;
}
这是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与此代码一起使用。
JSON确实没有任何东西。圆括号用于“对象”(关联数组),方括号用于没有键的数组(数字索引)。至于在Android中使用它,SDK中已包含适用于该类的现成类(无需下载)。
检查以下类:http : //developer.android.com/reference/org/json/package-summary.html
其他答案还提到了Jackson和GSON-流行的Android附加JSON库,以及json.org,这是Android中包含的准系统JSON包。
但我认为也值得注意的是,Android现在拥有自己的全功能JSON API。
这是在Honeycomb:API级别11中添加的。
这包括
-android.util.JsonReader:docs和源
-android.util.JsonWriter:docs和源
我还将添加一个额外的考虑因素,使我回到Jackson和GSON:我发现使用第三方库而不是android。*包很有用,因为这样我编写的代码可以在客户端和服务器之间共享。这与JSON之类的东西特别相关,在JSON中,您可能希望将数据一端串行化为JSON以发送到另一端。对于类似的用例,如果在两端使用Java,则有助于避免引入android。*依赖项。
或者我猜一个人可以抓住相关的android。*源代码并将其添加到您的服务器项目中,但是我没有尝试过...
您可以从http://json.org(Json-lib或org.json)下载一个库,并使用它来解析/生成JSON。
您只需要导入此
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");
然后我将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;
}
有不同的开源库,可用于解析json。
org.json:-如果您想读取或写入json,则可以使用此库。首先创建JsonObject:-
JSONObject jsonObj = new JSONObject(<jsonStr>);
现在,使用此对象获取您的值:-
String id = jsonObj.getString("id");
您可以在此处看到完整的示例
Jackson databind:-如果您想将json绑定并解析到特定的POJO类,则可以使用jackson-databind库,这会将您的json绑定到POJO类:-
ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);
您可以在此处看到完整的示例