我正在尝试解析资产中的JSON数据,但我的代码仍然显示错误。我想我做错了。
chem_elements.json
{
"Hydrogen": {
"symbol" : "H",
"atomic_number" : 1,
"atomic_weight" : 1.00974
},
"Helium" : {
"symbol" : "He",
"atomic_number" : 2,
"atomic_weight" : 4.002602
}
}
MainActivity.java
package com.example.ed.parsejson;
import android.app.Activity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends Activity {
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
parseJSONData();
}
public JSONObject parseJSONData() {
String JSONString = null;
JSONObject JSONObject = null;
try {
// Open the inputStream to the file
InputStream inputStream = getAssets().open("chem_elements.json");
int sizeOfJSONFile = inputStream.available();
// array that will store all the data
byte[] bytes = new byte[sizeOfJSONFile];
// reading data into the array from the file
inputStream.read(bytes);
// close the input stream
inputStream.close();
JSONString = new String(bytes, "UTF-8");
JSONObject = new JSONObject(JSONString);
// Get the JSON Object from the data
JSONObject parent = this.parseJSONData();
// This will store all the values inside "Hydrogen" in an element string
String element = parent.getString("Hydrogen");
// This will store "1" inside atomicnumber
String atomicNumber = parent.getJSONObject("Hydrogen").getString("atomic_number");
text.setText("element : " + element + " atomicNumber : " + atomicNumber);
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (JSONException x) {
x.printStackTrace();
return null;
}
return JSONObject;
}
}
我是非常新的,我想了解解析JSON数据是如何工作的,请问有人可以在这件事上启发我吗? Thx提前。
错误堆栈
09-30 00:01:15.256 21598-21598 /? D /错误:错误:总写字:1251640 09-30 00:01:15.257 21598-21598 /? E / JavaBinder:!!!失败的粘合剂交易! (包裹尺寸= 1251724) 09-30 00:01:15.257 21598-21598 /? E / AndroidRuntime:报告崩溃时出错 android.os.TransactionTooLargeException:数据包大小为1251724字节 在android.os.BinderProxy.transactNative(原生方法) 在android.os.BinderProxy.transact(Binder.java:503) 在android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4425) at com.android.internal.os.RuntimeInit $ UncaughtHandler.uncaughtException(RuntimeInit.java:90) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 在java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
09-30 00:01:15.163 21598-21598 / com.example.ed.parsejson E / AndroidRuntime:FATAL EXCEPTION:main 处理:com.example.ed.parsejson,PID:21598 java.lang.OutOfMemoryError:无法分配一个53字节的分配,其中627648个空闲字节和612KB,直到OOM;由于碎片而失败(对于一个新的缓冲区,需要连续的4096字节,其中最大的连续空闲0字节) 在org.json.JSONObject。(JSONObject.java:114) at org.json.JSONTokener.readObject(JSONTokener.java:350) at org.json.JSONTokener.nextValue(JSONTokener.java:100) 在org.json.JSONObject。(JSONObject.java:156) 在org.json.JSONObject。(JSONObject.java:173) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:51) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54) 在com.example.ed.parsejson.MainActivity.parseJSONData(MainActivity.java:54)
答案 0 :(得分:5)
你在自己内部调用parseJSONData()
导致无限递归调用:
JSONString = new String(bytes, "UTF-8"); JSONObject = new JSONObject(JSONString); // Get the JSON Object from the data JSONObject parent = this.parseJSONData(); // <-- this line // This will store all the values inside "Hydrogen" in an element string String element = parent.getString("Hydrogen");
只需删除该行,然后重试。
顺便说一下,您的TextView text
未初始化。