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;      }  }  
原创粉丝点击