1.JSONObject是Android原生的json类,通过import org.json.JSONObject来导入。
JsonObject需要添加gson jar包,通过com.google.gson.JsonObject来导入。
2.查看源码,可以看到
JSONObject通过HashMap来保存键值对。
JsonObject使用LinkedTreeMap来保存键值对。
3.JSONObject:添加value为null的键值对,Map保存的时候会删掉这一键值对;
JsonObject:添加value为null的键值对,Map会保留value值是null的键值对。
错误是指MainActivity的第85行,你看下你代码,如果解析出来的一个类为空,这个类在使用的时候就会报空指针,你加个非空判断。
另外,你用的是eclipse么,如果是Android studio的话,你引入个gson或者fastjson依赖,一句话就解析完成了;还有个插件,GsonFormat,直接把JSON完整的粘贴到里面,自动生成实体类。
给你一个工具类,它们都可以相互转化:。
你的解决方案:1.先把object转化为json字符串,然后用sp保存字符串即可.。
如果要反序列化,先通过sp获取json字符串,再将字符串转化为object; 。
下面的方法可直接调用,需要导入谷歌的gson包.。
public class JsonUtil {。
/**
* 把一个map变成json字符串。
* @param map。
* @return
*/
public static String parseMapToJson(Map<?, ?> map) {。
try {
Gson gson = new Gson();。
return gson.toJson(map);。
} catch (Exception e) {。
}
return null;。
}
/**
* 对象转换成json字符串。
* @param obj。
* @return
*/
public static String toJson(Object obj) {。
Gson gson = new Gson();。
return gson.toJson(obj);。
}
/**
* 把一个json字符串变成对象。
* @param json。
* @param cls。
* @return
*/
public static <T> T parseJsonToBean(String json, Class<T> cls) {。
Gson gson = new Gson();。
T t = null;。
try {
t = gson.fromJson(json, cls);。
} catch (Exception e) {。
}
return t;。
}
/**
* 把json字符串变成map。
* @param json。
* @return
*/
public static HashMap<String, Object> parseJsonToMap(String json) {。
Gson gson = new Gson();。
Type type = new TypeToken<HashMap<String, Object>>() {。
}.getType();。
HashMap<String, Object> map = null;。
try {
map = gson.fromJson(json, type);。
} catch (Exception e) {。
}
return map;。
}
/**
* 把json字符串变成集合。
* params: new TypeToken<List<yourbean>>(){}.getType(),。
*
* @param json。
* @param type new TypeToken<List<yourbean>>(){}.getType()。
* @return
*/
public static List<?> parseJsonToList(String json, Type type) {。
Gson gson = new Gson();。
List<?> list = gson.fromJson(json, type);。
return list;。
}
/**
*
* 获取json串中某个字段的值,注意,只能获取同一层级的value。
*
* @param json。
* @param key。
* @return
*/
public static String getFieldValue(String json, String key) {。
if (TextUtils.isEmpty(json))。
return null;。
if (!json.contains(key))。
return "";。
JSONObject jsonObject = null;。
String value = null;。
try {
jsonObject = new JSONObject(json);。
value = jsonObject.getString(key);。
} catch (JSONException e) {。
e.printStackTrace();。
}
return value;。
}
这样:
public static void jsonToBean(String data) {。
try {
JSONArray array = new JSONArray(data);//将json字符串转成json数组。
for (int i = 0; i < array.length(); i++) {//循环json数组。
JSONObject ob = (JSONObject) array.get(i);//得到json对象。
String name= ob.getString("name");//name这里是列名称,获取json对象中列名为name的值。
System.out.print(name);//输出name。
} catch (JSONException e) {。
扩展资料:
注意事项
java处理 json格式字符串 : 转成 JSONArray 或 JSONObject 类型。
1、如果是JSONArray ,格式: 最外层是 中括号,表示数组。
格式 : [{key:value},{key:value}... ]。
["str1","str2","str3",...]。
语法:JSONArray array = JSONArray.parseArray(strs)。
注:strs 必须是json格式的字符串, 以"[ ]"中括号开头结尾. 否则会报错.。
2、如果是JSONObject ,格式: 最外层是大括号,表示对象。
格式:{key:value}。
语法::JSONObject result = JSONArray.parseObject(strs );。
在Android中,由于类名相同,可能造成冲突,解决方案:
尽量使用同一个库下的JSON解析工具。
如果类型相同,但是包名不同,建议使用完整的包名+类名定义变量,例如java中,java.sql.Date和java.uitl.Date两个都是Date类,但是怎么区分呢,就可以通过包名+类名来区分:
java.sql.Date date1 = new java.sql.Date();。
java uitl.Date date2 = new java.uitl.Date();。
JSONObject也一样,可以使用这种方式。
Android中,json的解析,建议使用google提供的Gson这个开源库,json的解析或者对象与json转换,只需要一行代码。
Gson gson = new Gson();。
gson.toJson(object); gson.fromJson(json.Object.class);。