您的位置:首页 > 移动开发 > Android开发

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

2017-06-19 19:16 381 查看
在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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android json 数据