Android Json解析中如何解析没有key的解析办法
来源:互联网 发布:迅捷数据恢复注册问题 编辑:程序博客网 时间:2024/05/18 01:38
在Android 解析中,我们有时后会碰到没有键的{}中就是一个集合,这样咋一看,不知道如何解析,实际上是因为一直在使用Gson框架,使用熟练了,现在突然,不会解析了,网上查了一下,原来很简单的,在这个记录一下,方便以后使用,
没有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; } }
阅读全文
0 0
- Android Json解析中如何解析没有key的解析办法
- android中如何解析没有Key的Json数据
- android中如何解析没有Key的Json数据
- Android和Unity中,没有KEY的JSON数组解析
- json key数字开头的解析办法
- 变态的json解析,key为数字,设置没有key!如何解析呢?
- 变态的json解析,key为数字,设置没有key!如何解析呢?
- Json解析,没有Key 名,请问如何解析
- Json 解析数据 只有key,没有value的解析
- Android中json的解析
- android中json的解析
- android中JSON的解析
- android中JSON的解析
- Android中JSON的解析
- android中JSON的解析
- android中JSON的解析
- Android中JSON的解析
- android中JSON的解析
- 第七周(2) 打卡功能
- c++11 中函数声明 新关键字 delete的妙用之一: 搭配宏NonCopyable(ClassName) 使用
- Git 忘记切换分支,误将代码提交到了别的分支!
- 流程的Python 第一章:数据模型
- linux下安装及配置jenkins
- Android Json解析中如何解析没有key的解析办法
- 二级联动实现
- Use "adb disable-verity" to disable verity.
- /Debug-iphonesimulator/✖️✖️.build/Script-817CB3AD1B3BC68D0004AFEA.sh: line 2: ./.../.framework
- mybatis学习之模糊查询用户例子
- 深入理解计算机系统-笔记-CH 1 并发与并行
- JSP数据交互
- 一道好玩的题的解题代码
- pycharm加速安装python包的速度