JSONObject解析引发java.lang.OutOfMemoryError问题
2014-07-28 20:20
555 查看
先看代码
需要解析的json
{"code":0,"data":[{"id":null,"name":"Doe"},{"id":2,"name":"Sam"}]}
下面代码用JSONObject解析
这是一个比较常用的, 把Json字符串转为JsonObject的方法
但是, 如果这个jsonStr过大, 会引发OOM异常
改用JsonReader来读取可以避免此异常 (时间关系, 代码有点随意)
需要解析的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(); } } }
相关文章推荐
- java.lang.OutOfMemoryError: Java heap space 内存不足问题
- tomcat出现java.lang.OutOfMemoryError: PermGen space问题解决
- tomcat 换JDK和java.lang.OutOfMemoryError: Java heap space 问题
- 内存溢出问题(java.lang.OutOfMemoryError)
- 解决Exception in thread "main" java.lang.OutOfMemoryError: Java heap space问题
- 关于android编程遇到java.lang.OutOfMemoryError: bitmap size exceeds VM budget此类问题的原因及解决办法
- java.lang.OutOfMemoryError: Java heap space问题
- 教你解决问题:Compilation error java.lang.OutOfMemoryError
- android利用Bitmap加载图片所遇到的一个奇怪的OOM问题java.lang.OutOfMemoryError
- java.lang.OutOfMemoryError: PermGen space问题
- weblogic8.1项目向weblogic9.2移植的java.lang.OutOfMemoryError: PermGen space问题!
- 调用ajax,返回json, 报异常 java.lang.OutOfMemoryError: Java heap space
- java.lang.OutOfMemoryError问题
- java.lang.OutOfMemoryError:Java heap space问题
- SSH整合遇难到的非堆内存溢出问题java.lang.OutOfMemoryError: PermGen space
- struts2自定义模板内存溢出 java.lang.OutOfMemoryError: Java heap space(问题已解决)
- JBoss下问题- java.lang.OutOfMemoryError: PermGen space
- 问题描述 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 解决方案[转] 一直都知道可以设置jvm he
- 编译android遇到java虚拟机堆内存不够的问题 java.lang.OutOfMemoryError: GC overhead limit exceeded 解决方法