Java JSON解析和空指针
我试图解析一个JSON对象,但遇到了一个nullpointer错误,并且java.lang.String类型的值不能转换为JSONObject错误。我的代码如下。我非常感谢你的帮助Java JSON解析和空指针,java,android,json,Java,Android,Json,我试图解析一个JSON对象,但遇到了一个nullpointer错误,并且java.lang.String类型的值不能转换为JSONObject错误。我的代码如下。我非常感谢你的帮助 06-30 14:48:18.151: E/JSON Parser(10231): Error parsing data org.json.JSONException: Value Cannot of type java.lang.String cannot be converted to JSONObject 06
06-30 14:48:18.151: E/JSON Parser(10231): Error parsing data org.json.JSONException: Value Cannot of type java.lang.String cannot be converted to JSONObject
06-30 14:48:18.156: E/AndroidRuntime(10231): FATAL EXCEPTION: main
06-30 14:48:18.156: E/AndroidRuntime(10231): Process: rafa.weatherapp, PID: 10231
06-30 14:48:18.156: E/AndroidRuntime(10231): java.lang.NullPointerException
06-30 14:48:18.156: E/AndroidRuntime(10231): at rafa.weatherapp.MainActivity$AsyncTaskParseJson.onPostExecute(MainActivity.java:72)
06-30 14:48:18.156: E/AndroidRuntime(10231): at rafa.weatherapp.MainActivity$AsyncTaskParseJson.onPostExecute(MainActivity.java:1)
06-30 14:48:18.156: E/AndroidRuntime(10231): at android.os.AsyncTask.finish(AsyncTask.java:632)
06-30 14:48:18.156: E/AndroidRuntime(10231): at android.os.AsyncTask.access$600(AsyncTask.java:177)
06-30 14:48:18.156: E/AndroidRuntime(10231): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
06-30 14:48:18.156: E/AndroidRuntime(10231): at android.os.Handler.dispatchMessage(Handler.java:102)
06-30 14:48:18.156: E/AndroidRuntime(10231): at android.os.Looper.loop(Looper.java:146)
06-30 14:48:18.156: E/AndroidRuntime(10231): at android.app.ActivityThread.main(ActivityThread.java:5602)
06-30 14:48:18.156: E/AndroidRuntime(10231): at java.lang.reflect.Method.invokeNative(Native Method)
06-30 14:48:18.156: E/AndroidRuntime(10231): at java.lang.reflect.Method.invoke(Method.java:515)
06-30 14:48:18.156: E/AndroidRuntime(10231): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
06-30 14:48:18.156: E/AndroidRuntime(10231): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
06-30 14:48:18.156: E/AndroidRuntime(10231): at dalvik.system.NativeStart.main(Native Method)
这是我的主要活动
package rafa.weatherapp;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
TextView textview = null;
JSONObject currentTemperature = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.textview);
// we will using AsyncTask during parsing
new AsyncTaskParseJson().execute();
}
// you can make this class as another java file so it will be separated from your main activity.
public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
final String TAG = "AsyncTaskParseJson.java";
// set your json string url here
String yourJsonStringUrl = "https://api.forecast.io/forecast/5530508d3568e57848d53bf10cfade1f/37.8267,-122.42";
@Override
protected void onPreExecute() {}
@Override
protected String doInBackground(String... arg0) {
try {
// instantiate our json parser
JSONParser jParser = new JSONParser();
// get json string from url
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
JSONObject weatherData = new JSONObject();
currentTemperature = weatherData.getJSONObject("currently");
currentTemperature.getString("temperature").toString();
textview = (TextView) findViewById(R.id.textview);
textview.setText((CharSequence) currentTemperature);
Toast.makeText(MainActivity.this, "Text set", Toast.LENGTH_LONG);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String strFromDoInBg) {
currentTemperature.toString();
textview.setText((CharSequence) (currentTemperature));
}
}
}
包rafa.weatherapp;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.widget.TextView;
导入android.widget.Toast;
公共类MainActivity扩展了活动{
TextView TextView=null;
JSONObject currentTemperature=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview=(textview)findViewById(R.id.textview);
//我们将在解析期间使用AsyncTask
新建AsyncTaskParseJson().execute();
}
//您可以将这个类作为另一个java文件,这样它将与您的主要活动分离。
公共类AsyncTaskParseJson扩展AsyncTask{
final String TAG=“AsyncTaskParseJson.java”;
//在此处设置json字符串url
字符串yourJsonStringUrl=”https://api.forecast.io/forecast/5530508d3568e57848d53bf10cfade1f/37.8267,-122.42";
@凌驾
受保护的void onPreExecute(){}
@凌驾
受保护的字符串doInBackground(字符串…arg0){
试一试{
//实例化我们的json解析器
JSONParser jParser=新的JSONParser();
//从url获取json字符串
JSONObject json=jParser.getJSONFromUrl(yourJsonStringUrl);
JSONObject weatherData=新的JSONObject();
currentTemperature=weatherData.getJSONObject(“当前”);
currentTemperature.getString(“温度”).toString();
textview=(textview)findViewById(R.id.textview);
setText((CharSequence)currentTemperature);
Toast.makeText(MainActivity.this,“文本集”,Toast.LENGTH\u LONG);
}捕获(JSONException e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串strFromDoInBg){
当前温度.toString();
setText((CharSequence)(currentTemperature));
}
}
}
您需要将字符串保存在某个变量中,替换此行:
currentTemperature.getString("temperature").toString();
与:
并使用myRealTemperature设置文本视图。如果需要将字符串保存在某个变量中,请替换此行:
currentTemperature.getString("temperature").toString();
与:
并使用myRealTemperature设置Textview。存储currentTemperature JSONObject.getString(“温度”)。将字符串转换为正确的字符串类型,然后在要显示的Textview上发送该参数 当你打电话的时候
currentTemperature.getString("temperature").toString();
您没有将currentTemperature转换为字符串,您只是调用该方法,而不是将其分配到任何位置
此外,您还应该为该JSON对象创建一个模型,例如
public class CurrentTime{
String temperature;
String humidity;
}
依此类推,然后将JSON的所有值存储到这个类的一个对象中,您可以使用它做任何事情,创建setter和getter,这是一个更干净的代码存储currentTemperature JSONObject.getString(“温度”)。将字符串转换为适当的字符串类型,然后在要显示的文本视图上发送该参数 当你打电话的时候
currentTemperature.getString("temperature").toString();
您没有将currentTemperature转换为字符串,您只是调用该方法,而不是将其分配到任何位置
此外,您还应该为该JSON对象创建一个模型,例如
public class CurrentTime{
String temperature;
String humidity;
}
依此类推,然后将JSON的所有值存储到这个类的一个对象中,您可以使用它做任何事情,创建setter和getter,这样代码就更干净了我看到了一些问题:
- 首先,您将获得一个null指针,因为您的返回值为null
从
doInBackground()
- 您试图在doInBackground中显示toast,这在后台线程中是不允许的
- 您应该在
方法中初始化textViewonCreate
- 您正在尝试从
获取数据,但从未使用json初始化该数据weatherData
但是您编写了这个函数,只有您知道它返回什么。我看到了一些问题:
- 首先,您将获得一个null指针,因为您的返回值为null
从
doInBackground()
- 您试图在doInBackground中显示toast,这在后台线程中是不允许的
- 您应该在
方法中初始化textViewonCreate
- 您正在尝试从
获取数据,但从未使用json初始化该数据weatherData
但是您编写了这个函数,只有您知道它返回什么。实际上,您正在使用以下代码获取变量“json”中的json数据:
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
但在此之后,您没有在任何地方使用此变量,而是使用“wheatherData”变量,该变量没有数据。请检查一下。实际上,您正在使用以下代码获取变量“json”中的json数据:
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
但在此之后,您没有在任何地方使用此变量,而是使用“wheatherData”变量,该变量没有数据。请检查一次。仅仅因为您将
JSONObject
强制转换为CharSequence
,它是否真的说java.lang.String类型的值不能转换为JSONObject
?@SotiriosDelimanolis这是eclipse在铸造之前遇到错误时建议的解决方案。eclipse是短视的。它发现您的类型是错误的,并试图帮助您。旁注:您必须得到一个JSON异常,否则这两行textview.setText((CharSequence))将得到另一个异常