JSONObject解析引发java.lang.OutOfMemoryError问题

来源:互联网 发布:苹果2g网络怎么改4g 编辑:程序博客网 时间:2024/06/07 23:44

先看代码


需要解析的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<Person> persons = new ArrayList<Person>(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",}, {"id":2,"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<Person> persons = new ArrayList<Person>();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();}}}


0 0