org.json.JSONObject$1 类型的值 null 无法转换为 JSONObject

Posted

技术标签:

【中文标题】org.json.JSONObject$1 类型的值 null 无法转换为 JSONObject【英文标题】:Value null of type org.json.JSONObject$1 cannot be converted to JSONObject 【发布时间】:2016-08-04 15:33:15 【问题描述】:

我在使用 OpenWeatherMap API 时收到此异常错误。我只是想让 result 成为 JSONObject,但 null 不断出现。

@Override
    protected void onPostExecute(String result) 
        super.onPostExecute(result);

        // What's coming in as result...
        // Printed to the console...
        // null"coord":"lon":-0.13,"lat":51.51,"weather":["id":800,"main":"Clear",
        // "description":"clear sky","icon":"01d"],...


        try 
            JSONObject jsonObject = new JSONObject(result);
            String weatherInfo = jsonObject.getString("weather");

            Log.i("Weather Info", weatherInfo);
         catch (JSONException e) 
            e.printStackTrace();
        

   

JSON 数据很好,但我只想让它成为 JSONObject,但 null 部分正在捕获。任何想法为什么会发生这种情况?

同样来自该网站的JSON Response 是:

"coord":"lon":-0.13,"lat":51.51,"weather":["id":800,"main":"Clear","description":"clear sky","icon":"01d"],.....

为什么开头没有 null ? 感谢您的帮助。

【问题讨论】:

weather is jsonArray in your response 你不能在上面使用getString 在这个人帮助我之前我也遇到了同样的问题。 ***.com/a/46127581/8582710 试试这个并投票给他的答案 - ***.com/a/46127581/8582710 试试这个链接 - ***.com/a/54138888/10121512 【参考方案1】:

在您收到的数据中,天气是一个 JSONArray。

试试这个:

 String json = "\"coord\":\"lon\":-0.13,\"lat\":51.51,\"weather\":[\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"],.....";

try
    JSONObject jo = new JSONObject(json);
    JSONArray weather = jo.getJSONArray("weather");
    for(int i = 0;i < weather.length(); i++)
        JSONObject w = weather.getJSONObject(i);
        String main = w.getString("main");
        String description = w.getString("description");
        //...
    
catch (Exception e)


如您所说,如果服务器返回的结果以null 开头,您将遇到此异常org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONObject

这是因为此结果不是有效的 JSON 内容。

如果您确实从服务器收到此无效内容,解决方法可以是在解析 JSON 之前删除 null

String crappyPrefix = "null";

if(result.startsWith(crappyPrefix))
    result = result.substring(crappyPrefix.length(), result.length());

JSONObject jo = new JSONObject(result);

【讨论】:

感谢您的回复。我仍然收到错误 Value null of type org.json.JSONObject$1 cannot be convert to JSONObject 。它似乎只是不想接收传入的 JSON 数据。我从中获取它的站点一开始并没有 null,但是当我在 result 中获取它时做。这有关系吗? 这真的很有趣!感谢您解释:)。但是我不想使用硬编码的字符串,因为我正在尝试从 API 学习如何做到这一点。最新的更新看起来非常聪明。我一直忘记字符串操作。我试试看!谢谢。 @Nirekin 用于首先处理 null 对象,我必须从该结果中删除 null ...没有其他方法可以处理它【参考方案2】:

试试这个(对我有用)..我遇到了同样的问题

public class DownloadData extends AsyncTask<String , Void, String >

        HttpURLConnection httpURLConnection =null;
        URL url;


String resultString="";  <------- instead of setting it to null


        @Override
        protected String doInBackground(String... urls) 


            try 
                url = new URL(urls[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream is = httpURLConnection.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                int data = isr.read();
                while(data != -1)
                    char ch = (char) data;
                    resultString += ch;
                    data = isr.read();

                
                return resultString;



             catch (MalformedURLException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
            


            return null;
        

【讨论】:

【参考方案3】:

有时问题是您的响应为空,但您期望的是 JSONObject。 最好在服务器端解决它。如果您无法编辑服务器端代码,this question 和 this one 可能有用

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 how to answer【参考方案4】:

试试这个,

JSONObject jsonObject = new JSONObject(result);
        try 
            JSONArray jsonArray = jsonObject.getJSONArray("weather");

            for(int i=0;i<jsonArray.length();i++)
                JSONObject object=jsonArray.getJSONObject(i);
                String main =object.getString("main");
            
         catch (JSONException e) 
            e.printStackTrace();
        

【讨论】:

【参考方案5】:

错误意味着您的 JSON 无效可能

您可以测试您的 JSON 格式 here。

但你代码中的问题是你试图在这里使用 getString()

String weatherInfo = jsonObject.getString("weather");

虽然天气实际上是 JSONArray,但如果你希望它作为字符串使用

String weatherInfo = jsonObject.getJSONArray("weather").toString();

【讨论】:

【参考方案6】:

成员变量默认初始化, 如果是 String,它会被初始化为 null IE。写作String xyz; 等价于String xyz=null; 当我们将这个空字符串连接到另一个字符串时,java编译器将空值变成一个字符串 IE。 xyz=xyz+"abc"; //would result as nullabc

这就是您的 JSON 数据所发生的情况,您作为字符串获得的数据工作正常,但是当您将其作为 JSON 对象放置时,它会返回异常

"Value null of type org.json.JSONObject$1 cannot be converted to JSONObject" 因为它将其视为空值。

    最好将字符串初始化为空字符串,即。 String xyz="";

    或者您可以将字符串开头的 null 删除为

    if(result.startsWith("null")) 结果 = result.substring("null".length(), result.length()); JSONObject json = new JSONObject(结果);

【讨论】:

【参考方案7】:

试试下面的代码,它对我有用。

JSONParser jParser = new JSONParser();
JSONObject weatherUrlObject =jParser.getJSONFromUrl(weatherUrl);
 try 
        JSONArray weather = weatherUrlObject.getJSONArray("weather");
        WeatherNow.setWeather_id(weather.getJSONObject(0).getString("id").toString());
        WeatherNow.setWeather_main(weather.getJSONObject(0).getString("main").toString());
        WeatherNow.setWeather_description(weather.getJSONObject(0).getString("description").toString());
        WeatherNow.setWeather_icon(weather.getJSONObject(0).getString("icon").toString());
     catch (Exception e) 
                    e.printStackTrace();
                

JSONPaser 类:

public class JSONParser 

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() 



public JSONObject getJSONFromUrl(String url) 

    // Making HTTP request
    try 
        // defaultHttpClient

        DefaultHttpClient httpClient = new DefaultHttpClient();

        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();          

     catch (UnsupportedEncodingException e) 
        e.printStackTrace();
     catch (ClientProtocolException e) 
        e.printStackTrace();
     catch (IOException e) 
        e.printStackTrace();
    

    try 
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) 
            sb.append(line + "\n");
        

        is.close();
        json = sb.toString();
     catch (Exception e) 
        Log.e("Buffer Error", "Error converting result " + e.toString());
    

    // try parse the string to a JSON object
    try 
        jObj = new JSONObject(json);
     catch (JSONException e) 
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    

    // return JSON String
    return jObj;



WeatherNow 是我的 Getter-Setter 方法。

【讨论】:

什么是JSONParserWeatherNow?不要在没有任何解释的情况下发布任何内容。 感谢您的快速回复。我试图让 result 进入方法以首先成为 JSONObject,但这就是问题所在。 String weatherInfo = jsonObject.getString("weather");替换:JSONArray 天气 = jsonObject.getJSONArray("weather");

以上是关于org.json.JSONObject$1 类型的值 null 无法转换为 JSONObject的主要内容,如果未能解决你的问题,请参考以下文章

值类型 org.json.JSONObject 无法转换为 JSONArray

未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器

如何使用 ResponseEntity 返回 JSONObject 而不是 HashMap? (未找到类型返回值的转换器:类 org.json.JSONObject)

org.json.JSONObject 类型的值无法转换为 JSONArray

JAVA中JSONObject

net.sf.json.JSONObject 和org.json.JSONObject 的差别