sam linux内存溢出,JSONObject解析引发java.lang.OutOfMemoryError问题

先看代码

需要解析的json

{"code":0,"data":[{"id":null,"name":"Doe"},{"id":2,"name":"Sam"}]}

下面代码用JSONObject解析

private void parseByJsonObject(String jsonStr) {

try {

JSONObject obj = new JSONObject(jsonStr);

int code = obj.isNull("code") ? 0 : obj.getInt("code");

JSONArray datas = obj.isNull("data") ? new JSONArray() : obj.getJSONArray("data");

int length = datas.length();

List persons = new ArrayList(length);

for (int i = 0; i < length; i++) {

JSONObject data = (JSONObject) datas.get(i);

int id = data.isNull("id") ? 0 : data.getInt("id");

String name = data.isNull("name") ? "" : data.getString("name");

Person person = new Person();

person.setId(id);

person.setName(name);

persons.add(person);

}

// 输出 code=0;persons=[{"id":0,"name":"Doe",},"name":"Sam",}]

Log.e("scrat","code="+code + ";persons="+persons.toString());

} catch (JSONException e) {

e.printStackTrace();

}

}

这是一个比较常用的,把Json字符串转为JsonObject的方法

但是,如果这个jsonStr过大,会引发OOM异常

改用JsonReader来读取可以避免此异常 (时间关系,代码有点随意)

@SuppressLint("NewApi")

private void parseByJsonReader(String jsonStr) throws IOException {

JsonReader jsonReader = null;

InputStream in = null;

Reader reader = null;

try {

in = new ByteArrayInputStream(jsonStr.getBytes());

reader = new InputStreamReader(in,"UTF-8");

jsonReader = new JsonReader(reader);

int code = 0;

List persons = new ArrayList();

jsonReader.beginObject();

while (jsonReader.hasNext()) {

String tmpName1 = jsonReader.nextName();

if ("code".equals(tmpName1)) {

code = jsonReader.nextInt();

} else if ("data".equals(tmpName1)) {

jsonReader.beginArray();

while (jsonReader.hasNext()) {

int id = 0;

String name = null;

jsonReader.beginObject();

while (jsonReader.hasNext()) {

String tmpName2 = jsonReader.nextName(); // 一定要放到 jsonReader.peek()的判断前面,否则判断NULL无效

if (jsonReader.peek() == JsonToken.NULL) {

jsonReader.skipValue();

continue;

}

if ("id".equals(tmpName2)) {

id = jsonReader.nextInt();

} else if ("name".equals(tmpName2)) {

name = jsonReader.nextString();

} else {

jsonReader.skipValue();

}

}

jsonReader.endObject();

Person person = new Person();

person.setId(id);

person.setName(name);

persons.add(person);

}

jsonReader.endArray();

} else {

jsonReader.skipValue();

}

}

jsonReader.endObject();

Log.e("scrat","code="+code + ";persons="+persons.toString());

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} finally {

if (reader != null) {

reader.close();

}

if (in != null) {

in.close();

}

if (jsonReader != null) {

jsonReader.close();

}

}

}

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值