Java JSON解析和空指针

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

我试图解析一个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-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,这在后台线程中是不允许的
  • 您应该在
    onCreate
    方法中初始化textView
  • 您正在尝试从
    weatherData
    获取数据,但从未使用json初始化该数据

但是您编写了这个函数,只有您知道它返回什么。

我看到了一些问题:

  • 首先,您将获得一个null指针,因为您的返回值为null 从
    doInBackground()
  • 您试图在doInBackground中显示toast,这在后台线程中是不允许的
  • 您应该在
    onCreate
    方法中初始化textView
  • 您正在尝试从
    weatherData
    获取数据,但从未使用json初始化该数据


但是您编写了这个函数,只有您知道它返回什么。

实际上,您正在使用以下代码获取变量“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))将得到另一个异常