Android Json解析中如何解析没有key的解析办法
2017-06-19 19:16
381 查看
在Android 解析中,我们有时后会碰到没有键的{}中就是一个集合,这样咋一看,不知道如何解析,实际上是因为一直在使用Gson框架,使用熟练了,现在突然,不会解析了,网上查了一下,原来很简单的,在这个记录一下,方便以后使用,
没有key的数据集
没有key的单个对象
使用Gson创建一个ProvinceBean,当安装好Gson,Command+N选择GsonFormat,将上面的字符中的一个对象,复制到弹出的对话框中,点击OK,就创建成了下面的类,默认是无法直接将这整个字符串,转换为
解析方法一:
这个是根据json中一个对象,使用Gson创建的bean类(其实就是用那些字段创建了get/set方法),通过上面的代码就可以使这个json字符串,转变为
第一种方法是通过JSON来转换的,第二种方法是用GSON来转换。两种方法的难易程度相差不大。第二种要导入Gson包。推荐使用第二种方法,
这样的对象如何转换为JavaBean?
同样使用Gson创建一个SignInfo
两种方法打印的内容如下:
是有所不同的,当key对应的为’ ‘,时,通过方法二,尽然可以得到’null’
最后在打包apk的时候要记得不要混淆这些JavaBean类,否则会造成无法解析的。在proguard_rules.pro中配置
最后再贴一个JsonUtils
没有key的数据集
没有key的单个对象
没有key的数据集
例如如下 的json字符串如何解析呢![ { "id":"1", "provinceid":"110000", "province":"北京", "type":"1" }, { "id":"2", "provinceid":"120000", "province":"天津", "type":"1" }, { "id":"3", "provinceid":"130000", "province":"河北省", "type":"1" } ]
使用Gson创建一个ProvinceBean,当安装好Gson,Command+N选择GsonFormat,将上面的字符中的一个对象,复制到弹出的对话框中,点击OK,就创建成了下面的类,默认是无法直接将这整个字符串,转换为
List<ProviceBean>的,需要我们自己添加一个方法,
public class ProviceBean implements IPickerViewData { private String id; private String provinceid; private String province; private String type; public static ProviceBean objectFromData(String str, String key) { try { JSONObject jsonObject = new JSONObject(str); return new Gson().fromJson(jsonObject.getJSONObject(key).toString(), ProviceBean.class); } catch (JSONException e) { e.printStackTrace(); } return null; } /** * 从json字符串中获取省的集合 * * @param json * @return */ public static List<ProviceBean> arrayProvieBeanFromJson(String json) { List<ProviceBean> list = new ArrayList<>(); try { JSONArray jsonArray = new JSONArray(json); for (int i = 0; i < jsonArray.length(); i++) { JSONObject item = jsonArray.getJSONObject(i); ProviceBean proviceBean = new ProviceBean(); proviceBean.setId(item.getString("id")); proviceBean.setProvinceid(item.getString("provinceid")); proviceBean.setProvince(item.getString("province")); proviceBean.setType(item.getString("type")); list.add(proviceBean); } } catch (JSONException e) { e.printStackTrace(); } return list; } /** * 将没有key字符串转换为JavaBean * @param result * @return */ public static List<ProviceBean> parseData(String result) {//Gson 解析 ArrayList<ProviceBean> detail = new ArrayList<>(); try { JSONArray data = new JSONArray(result); Gson gson = new Gson(); for (int i = 0; i < data.length(); i++) { ProviceBean entity = gson.fromJson(data.optJSONObject(i).toString(), ProviceBean.class); detail.add(entity); } } catch (Exception e) { e.printStackTrace(); } return detail; } @Override public String toString() { return "ProviceBean{" + "id='" + id + '\'' + ", provinceid='" + provinceid + '\'' + ", province='" + province + '\'' + ", type='" + type + '\'' + '}'; } }
解析方法一:
public static List<ProviceBean> arrayProvieBeanFromJson(String json) { List<ProviceBean> list = new ArrayList<>(); try { JSONArray jsonArray = new JSONArray(json); for (int i = 0; i < jsonArray.length(); i++) { JSONObject item = jsonArray.getJSONObject(i); ProviceBean proviceBean = new ProviceBean(); proviceBean.setId(item.getString("id")); proviceBean.setProvinceid(item.getString("provinceid")); proviceBean.setProvince(item.getString("province")); proviceBean.setType(item.getString("type")); list.add(proviceBean); } } catch (JSONException e) { e.printStackTrace(); } return list; }
这个是根据json中一个对象,使用Gson创建的bean类(其实就是用那些字段创建了get/set方法),通过上面的代码就可以使这个json字符串,转变为
List<ProviceBean>.
解析方法二: public List<ProviceBean> parseData(String result) {//Gson 解析 ArrayList<ProviceBean> detail = new ArrayList<>(); try { JSONArray data = new JSONArray(result); Gson gson = new Gson(); for (int i = 0; i < data.length(); i++) { ProviceBean entity = gson.fromJson(data.optJSONObject(i).toString(), ProviceBean.class); detail.add(entity); } } catch (Exception e) { e.printStackTrace(); } return detail; }
第一种方法是通过JSON来转换的,第二种方法是用GSON来转换。两种方法的难易程度相差不大。第二种要导入Gson包。推荐使用第二种方法,
没有key的单个对象
字符串如下:{"result":0, "msg":"", "sign_days":1, "sign_nums":2, "sign_record_list[{"id":91, "pid":"91", "p_img":"", "p_title":"", "sign_nums":1, "create_time":"2017-06-26 18:31:30"}]}
这样的对象如何转换为JavaBean?
同样使用Gson创建一个SignInfo
//方法一: public static SignInfo objectFromData(String str) { SignInfo info = new SignInfo(); try { JSONObject jsonObject = new JSONObject(str); int result = jsonObject.getInt("result"); String msg = jsonObject.getString("msg"); int sign_days = jsonObject.getInt("sign_days"); int sign_nums = jsonObject.getInt("sign_nums"); List<SignRecordListBean> list = SignRecordListBean.arraySignRecordListBeanFromData(str, "sign_record_list"); info.setResult(result); info.setMsg(msg); info.setSign_days(sign_days); info.setSign_nums(sign_nums); info.setSign_record_list(list); return info; } catch (JSONException e) { e.printStackTrace(); } return info; } //方法二: public static SignInfo parseData(String result) { //Gson 解析 SignInfo info = new SignInfo(); try { JSONObject data = new JSONObject(result); Gson gson = new Gson(); gson.fromJson(data.toString(),SignInfo.class); } catch (Exception e) { e.printStackTrace(); } return info; }
两种方法打印的内容如下:
方法一:SignInfo{result=0, msg='', sign_days=0, sign_nums=0, sign_record_list=[]} 方法二:SignInfo{result=0, msg='null', sign_days=0, sign_nums=0, sign_record_list=null}
是有所不同的,当key对应的为’ ‘,时,通过方法二,尽然可以得到’null’
最后在打包apk的时候要记得不要混淆这些JavaBean类,否则会造成无法解析的。在proguard_rules.pro中配置
# Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { *; } #防止混淆造成apk中gson无法解析bean //这个是JavaBean放置的位置 -keep com.alpha.alphaapp.account.** {*;}
最后再贴一个JsonUtils
/** * json 和 实体类之间的相互转换 * @author 00 * */ public class JsonUtil { /** * 将一个实体对象 转换成一个json字符串 提示对象中可包含集合 * @param t 实体类 * @return */ public static <T> String beanToJson(T t){ Gson gson = new Gson(); String json = gson.toJson(t); return json; } /** * 将一个json字符串 转换成一个实体类对象 可包含list * @param json * @param t * @return */ public static <T> T jsonToBean(String json,Class<T> class1) throws InstantiationException, IllegalAccessException{ Gson gson = new Gson(); T t = class1.newInstance(); t=gson.fromJson(json, class1); return t; } /** * 将json字符串转换成一个json对象 * @param str * @return */ public static JSONObject stringToJson(String str){ try { return new JSONObject(str); } catch (JSONException e) { e.printStackTrace(); return null; } } public static String getString(InputStream is){ try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while((len = is.read(buffer)) != -1){ baos.write(buffer, 0, len); } byte[] byteArray = baos.toByteArray(); //String str = new String(byteArray); return new String(byteArray,"utf-8"); } catch (IOException e) { e.printStackTrace(); } return ""; } /** * 从assert文件夹中读取json文件,然后转化为json对象 * @throws Exception */ public static JSONObject getJsonDataFromAssets(Context context,String jsonFileName) throws Exception{ JSONObject mJsonObj = null; StringBuffer sb = new StringBuffer(); InputStream is = context.getAssets().open(jsonFileName); int len = -1; byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1){ sb.append(new String(buf, 0, len, "UTF-8")); } is.close(); mJsonObj = new JSONObject(sb.toString()); return mJsonObj; } }
相关文章推荐
- 变态的json解析,key为数字,设置没有key!如何解析呢?
- 变态的json解析,key为数字,设置没有key!如何解析呢?
- Android和Unity中,没有KEY的JSON数组解析
- Json解析,没有Key 名,请问如何解析
- 如何解析key为数字的string类型的Json数据
- Android网络开发中如何使用JSON进行网络通信---Android JSON数据通讯方法解析
- json key数字开头的解析办法
- Android如何解析json数组对象
- Android中如何进行JSON解析
- Android开发中如何解析Json
- android解析json时动态获取key
- Json 解析数据 只有key,没有value的解析
- Android——网络交互,如何调用接口并且json解析json格式和pull解析xml格式
- Android中Gson、FastJson解析动态的Key
- Android数据解析获取JSONObject的key值-Iterator应用
- Android中如何简单完成Json解析
- FastJSON使用心得——如何解析带中文或者数字key的数据
- Android如何解析json数组对象
- Android网络开发中如何使用JSON进行网络通信---Android JSON数据通讯方法解析
- Android JSON解析不固定key