Android Json解析中如何解析没有key的解析办法

在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值