更多JSON和Android问题

更多JSON和Android问题,android,json,Android,Json,我正在尝试解析android应用程序中的一些JSON。但是我有两个错误。第一个是“字符串类型的值无法转换为JSON对象”(我通过更改几行代码消除了这个错误,但可能弄糟了一些东西,但我不知道是什么原因导致应用程序正在运行)。第二个错误是空指针错误 我知道这里已经有很多关于这方面的代码了,因为他们都使用hive教程直接跳入数组。我试着编辑这段代码以将我的JSON放入ListView,但就是不能完全理解。我认为我的问题是,我在解析器中返回了一个JSONObject,它调用了我的第一个对象(标识),然后

我正在尝试解析android应用程序中的一些JSON。但是我有两个错误。第一个是“字符串类型的值无法转换为JSON对象”(我通过更改几行代码消除了这个错误,但可能弄糟了一些东西,但我不知道是什么原因导致应用程序正在运行)。第二个错误是空指针错误

我知道这里已经有很多关于这方面的代码了,因为他们都使用hive教程直接跳入数组。我试着编辑这段代码以将我的JSON放入ListView,但就是不能完全理解。我认为我的问题是,我在解析器中返回了一个JSONObject,它调用了我的第一个对象(标识),然后我的代码立即跳入数组,数组中没有,因为标识的不是数组,信息是。那么,在代码中,我如何获得标识的对象,然后获得信息的对象(从而使用上述代码跳入信息数组)?我从未做过JSON解析,所以这对我来说有点困难。我很确定这就是问题所在,我只是不知道如何解决它。这快把我逼疯了。我在JSON/Android上能找到的所有东西都使用一个以数组开头的JSON,我的代码会处理这个数组。我只是不知道如何做上面的事情:获取第二个对象的数组。任何帮助都将不胜感激。我已经绞尽脑汁好几天了,试着做不同的事情。该应用程序有时会运行,不会在屏幕上显示任何内容,其他时候该应用程序会崩溃,并出现一个错误,该错误表示String无法转换JSONObject,还有几次我出现空指针错误。正如我提到的,我认为这是因为我试图在“标识”上调用数组,而我应该在“信息”上调用它。但我不知道如何通过识别然后跳入信息数组。我确信它只是在正确的地方写了几行代码,但我不知道在哪里

JSON如下所示:

  {
  "identified": "yes",
  "Information":
  [
        {
            "state": "Arkansas",
            "type": "landlocked",
            "additionalinfo": "{ search: 'online', website: 'http://states.arkansas.com', latitudeandlongitude: '93905, 63550}",
            "outdoorfun": "yes",
            "cold": "no"
        },
        {
            "state": "chicago",
            "type": "windy",
            "additionalinfo": "{ search: 'online', website: 'http://states.chicago.com', latitudeandlongitude: '23905, 45355}",
            "outdoorfun": "no",
            "cold": "yes"
        }
   ]
}
活动类别代码的主要部分如下:

// JSON Node names
private static final String TAG_IDENTIFIED = "id";
private static final String TAG_INFORMATION = "information";
private static final String TAG_STATE = "state";
private static final String TAG_TYPE = "type";
private static final String TAG_ADDITIONALINFO = "additionalinfo";
private static final String TAG_OUTDOORFUN = "outdoorfun";
private static final String TAG_COLD = "cold";


// contacts JSONArray
JSONArray information = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> stateList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

        try{ 



        for(int i = 0; i < information.length(); i++){
            information =json.getJSONArray(TAG_INFORMATION);

            JSONObject c = information.getJSONObject(i);

            // Storing each json item in variable
            String name = c.getString(TAG_STATE);
            String type = c.getString(TAG_TYPE);

            // Phone number is agin JSON Object
            JSONObject additionalinfo = c.getJSONObject(ADDITIONALINFO);
            String outdoorfun = c.getString(TAG_OUTDOORFUN);
            String cold = c.getString(TAG_COLD);


            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_NAME, name);
            map.put(TAG_TYPE, type);
            map.put(TAG_OUTDOORFUN, outdoorfun);




            informationList.add(map);
        }
        }
     catch (JSONException e) {
        e.printStackTrace();
    }


    /**
     * Updating parsed JSON data into ListView
     * */
    ListAdapter adapter = new SimpleAdapter(this, informationList,
            R.layout.list_item,
            new String[] {TAG_NAME, TAG_TYPE, TAG_OUTDOORFUN }, new int[] {
                    R.id.name, R.id.type, R.id.outdoorfun });

    setListAdapter(adapter);

    // selecting single ListView item
    ListView lv = getListView();

    // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
            String type = ((TextView) view.findViewById(R.id.type)).getText().toString();
            String outdoorfun = ((TextView) view.findViewById(R.id.outdoorfun)).getText().toString();




            // Starting new intent
            Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_TYPE, type);
            in.putExtra(TAG_OUTDOORFUN, outdoorfun);
            startActivity(in);

        }
    });
单一列表活动如下所示:

    package com.androidhive.jsonparsing;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SingleMenuItemActivity  extends Activity {

    // JSON node keys

    private static final String TAG_ID = "id";
    private static final String TAG_INFORMATION = "information";
    private static final String TAG_STATE = "state";
    private static final String TAG_TYPE = "type";
    private static final String TAG_ADDITIONALINFO = "additionalinfo";
    private static final String TAG_OUTDOORFUN = "outdoorfun";
    private static final String TAG_COLD = "cold";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_list_item);

        // getting intent data
        Intent in = getIntent();

        // Get JSON values from previous intent
        String name = in.getStringExtra(TAG_NAME);
        String type = in.getStringExtra(TAG_TYPE);
        String outdoorfun = in.getStringExtra(TAG_OUTDOORFUN);

        // Displaying all values on the screen
        TextView lblName = (TextView) findViewById(R.id.name_label);
        TextView lblType = (TextView) findViewById(R.id.type_label);
        TextView lblOutdoorfun = (TextView) findViewById(R.id.outdoorfun_label);

        lblName.setText(name);
        lblType.setText(type);
        lblOutdoorfun.setText(outdoorfun);
    }
}

我想您可能想要
标记
或您的JSON来读取

"information":
  [
你的案子不相符


我还认为您可能需要在for循环之外检索信息数组(也就是说,
json.getJSONArray
应该在for循环之外。

我想您可能需要查看一下;您的json无效,因此这可能会导致您在JSONObject的字符串方面出错。此外,您可能需要查看Android json解析类的文档:另一条注释:您可能需要例如,在尝试让您的活动和ListView正常工作之前,您可以专注于让JSON解析并查看LogCat上的输出。我刚刚检查了JSONLint,JSON是有效的。这正是运行android hive教程的代码,效果很好。唯一的区别是我的JSON在数组之前是一个对象。如果我能在跳入数组之前处理该对象,那么一切都会正常工作。我只是不知道该如何处理该对象。我已经尝试通过数组for循环上方的JSON代码将其取出,并将其放入字符串中。但没有用。for循环很快就会正常工作当我以数组的方式找出如何处理已识别的对象时,activity和listview在我运行教程时就已经开始工作了,所以这段代码没有问题。我想这只是我忽略的第一个对象,它会把所有东西都扔掉。我不知道如何处理它。对不起,我的错。JSON是独立的d有效,但“additionalinfo”的值不是一个JSON对象,而是一个字符串。这是故意的吗?我已经将JSON.getJSONArray从for循环中拉了出来。我想到了这一点。并修复了错误。我没有得到的是,我这里的完全相同的代码适用于没有“标识”的JSON对象。删除该ID对象将使JSON与教程完全相同。因此不同之处在于。我认为我需要做的是至少在for循环的正上方确认该对象。然后代码将转到下一个对象…对吗?LOGCAT说我在information=JSON.getJSONArray(TAG_information)处有一个空指针;您是否从
Log.e(“JSON解析器”,“错误解析数据”+e.toString())获得打印输出因为我猜函数调用可能返回null。现在我得到的字符串类型的值不能转换为JSONObject。你不需要确认任何其他你不需要的键。Android JSON解析器不是那种线性解析器;你可以通过名字来要求你想要的东西。
"information":
  [