【问题标题】:Get JSONArray without array name?获取没有数组名称的 JSONArray?
【发布时间】:2012-04-27 05:29:47
【问题描述】:

我是 JSON 新手,正在尝试本教程: http://p-xr.com/android-tutorial-how-to-parse-read-json-data-into-a-android-listview/#comments

我是 JSON、C 语言、Java 和 Android 的新手,但我正在学习。本教程使用我所谓的命名数组,但我将在我的 android 项目中使用的所有 JSON 都将使用没有命名数组的简单表行。我正在使用的 JSON 和教程中的地震 json 示例如下。

本教程遍历地震数组并使用以下代码转换为 JAVA hashmap 列表:

JSONArray  earthquakes = json.getJSONArray("earthquakes");
    for(int i=0;i<earthquakes.length();i++){                        
        HashMap<String, String> map = new HashMap<String, String>();    
        JSONObject e = earthquakes.getJSONObject(i);

        map.put("id",  String.valueOf(i));
        map.put("name", "Earthquake name:" + e.getString("eqid"));
        map.put("magnitude", "Magnitude: " +  e.getString("magnitude"));
        mylist.add(map);            
}

我的问题是,如果我的 JSON 如下所示,我该如何使用 json.getJSONArray("")?我可以转换其余代码,如果我没有strJsonArrayName,我只需要知道如何使用getJSONArray("strJsonArrayName") 加载该JSON。

我的 JSON(未命名数组)

[
  {
    "cnt":1,
    "name":"American",
    "pk":7
  },
  {
    "cnt":2,
    "name":"Celebrities",
    "pk":3
  },
  {
    "cnt":1,
    "name":"Female",
    "pk":2
  },
  {
    "cnt":1,
    "name":"Language",
    "pk":8
  },
  {
    "cnt":1,
    "name":"Male",
    "pk":1
  },
  {
    "cnt":1,
    "name":"Region",
    "pk":9
  }
]

教程的 JSON(命名数组)

{
  "earthquakes":[
    {
      "eqid":"c0001xgp",
      "magnitude":8.8,
      "lng":142.369,
      "src":"us",
      "datetime":"2011-03-11 04:46:23",
      "depth":24.4,
      "lat":38.322
    },
    {
      "eqid":"c000905e",
      "magnitude":8.6,
      "lng":93.0632,
      "src":"us",
      "datetime":"2012-04-11 06:38:37",
      "depth":22.9,
      "lat":2.311
    },
    {
      "eqid":"2007hear",
      "magnitude":8.4,
      "lng":101.3815,
      "src":"us",
      "datetime":"2007-09-12 09:10:26",
      "depth":30,
      "lat":-4.5172
    },
    {
      "eqid":"c00090da",
      "magnitude":8.2,
      "lng":92.4522,
      "src":"us",
      "datetime":"2012-04-11 08:43:09",
      "depth":16.4,
      "lat":0.7731
    },
    {
      "eqid":"2007aqbk",
      "magnitude":8,
      "lng":156.9567,
      "src":"us",
      "datetime":"2007-04-01 18:39:56",
      "depth":10,
      "lat":-8.4528
    },
    {
      "eqid":"2007hec6",
      "magnitude":7.8,
      "lng":100.9638,
      "src":"us",
      "datetime":"2007-09-12 21:49:01",
      "depth":10,
      "lat":-2.5265
    },
    {
      "eqid":"a00043nx",
      "magnitude":7.7,
      "lng":100.1139,
      "src":"us",
      "datetime":"2010-10-25 12:42:22",
      "depth":20.6,
      "lat":-3.4841
    },
    {
      "eqid":"2010utc5",
      "magnitude":7.7,
      "lng":97.1315,
      "src":"us",
      "datetime":"2010-04-06 20:15:02",
      "depth":31,
      "lat":2.3602
    },
    {
      "eqid":"2009mebz",
      "magnitude":7.6,
      "lng":99.9606,
      "src":"us",
      "datetime":"2009-09-30 08:16:09",
      "depth":80,
      "lat":-0.7889
    },
    {
      "eqid":"2009kdb2",
      "magnitude":7.6,
      "lng":92.9226,
      "src":"us",
      "datetime":"2009-08-10 17:55:39",
      "depth":33.1,
      "lat":14.0129
    }
  ]
}

在本教程中,根据 @MДΓΓ БДLL 和 @Cody Caughlan 的回答,我能够将 JSONFunctions.getJSONFromURL 重新格式化为 JSONArray 而不是 JSONObject。这是我修改后的工作代码,谢谢!

public class JSONfunctions {
public static JSONArray getJSONfromURL(String url){
    InputStream is = null;
    String result = "";
    JSONArray jArray = null;

            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(url);
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            is.close();
            result=sb.toString();

        jArray = new JSONArray(result);            
    return jArray;
}
}

【问题讨论】:

    标签: android arrays json


    【解决方案1】:

    您根本不需要调用json.getJSONArray(),因为您正在使用的JSON 已经 一个数组。所以,不要构造JSONObject的实例;使用JSONArray。这应该足够了:

    // ...
    JSONArray json = new JSONArray(result);
    // ...
    
    for(int i=0;i<json.length();i++){                        
        HashMap<String, String> map = new HashMap<String, String>();    
        JSONObject e = json.getJSONObject(i);
    
        map.put("id",  String.valueOf(i));
        map.put("name", "Earthquake name:" + e.getString("eqid"));
        map.put("magnitude", "Magnitude: " +  e.getString("magnitude"));
        mylist.add(map);            
    }
    

    您不能使用与教程中完全相同的方法,因为您处理的 JSON 需要在根目录解析为 JSONArray,而不是 JSONObject

    【讨论】:

    • 好的,我明白了。我将 getJSONObject 方法转换为 getJSONArray 方法,并将他的 httpPost 更改为 httpGet,它现在可以工作了!谢谢你!
    • 你能告诉我这个结果是什么吗?JSONArray json = new JSONArray(result);
    • 不行! @MattBall
    • 如果我有一个未命名的 json 数组,如何设置我的 java 模型类?
    • @KaveeshKanwal 使用 JSON 数组中的任何内容的 List/Set/Collection/array。
    【解决方案2】:

    JSONArray 有一个构造函数,它接受 String 源(假定为数组)。

    像这样的

    JSONArray array = new JSONArray(yourJSONArrayAsString);
    

    【讨论】:

    • 没错,但我的 JSON 没有数组名称。我在你的 JSONArrayAsString 中放了什么?你是说我应该将整个 JSON 输出字符串作为参数传递吗?
    • 好的,我想我明白你在说什么,请确认:我使用你提到的新 JSONArray 作为参数而不是“地震”
    • @Ricky 这不太对。您需要 getJSONfromURL() 方法返回 JSONArray,而不是 JSONObject
    【解决方案3】:

    我假设一个命名的 JSONArray 是一个 JSONObject,并从服务器访问数据以填充一个 Android GridView。值得我的方法是:

    private String[] fillTable( JSONObject jsonObject ) {
       String[] dummyData = new String[] {"1", "2", "3", "4", "5", "6", "7","1", "2", "3", "4", "5", "6", "7","1", "2", "3", "4", "5", "6", "7", };
      if( jsonObject != null ) {
          ArrayList<String> data = new ArrayList<String>();
          try {
              // jsonArray looks like { "everything" : [{}, {},] }
              JSONArray jsonArray = jsonObject.getJSONArray( "everything" );
              int number = jsonArray.length(); //How many rows have got from the database?
              Log.i( Constants.INFORMATION, "Number of ows returned:  " + Integer.toString( number ) );
                      // Array elements look like this
              //{"success":1,"error":0,"name":"English One","owner":"Tutor","description":"Initial Alert","posted":"2013-08-09 15:35:40"}
              for( int element = 0; element < number; element++ ) { //visit each element
                 JSONObject jsonObject_local = jsonArray.getJSONObject( element );
                 //  Overkill on the error/success checking
                 Log.e("JSON SUCCESS", Integer.toString( jsonObject_local.getInt(Constants.KEY_SUCCESS) ) );
                 Log.e("JSON ERROR", Integer.toString( jsonObject_local.getInt(Constants.KEY_ERROR) ) );
                    if ( jsonObject_local.getInt( Constants.KEY_SUCCESS) == Constants.JSON_SUCCESS ) {
                       String name = jsonObject_local.getString( Constants.KEY_NAME );
                       data.add( name );
                       String owner = jsonObject_local.getString( Constants.KEY_OWNER );
                       data.add( owner );
                       String description = jsonObject_local.getString( Constants.KEY_DESCRIPTION );
                       Log.i( "DESCRIPTION", description );
                       data.add( description ); 
                       String date = jsonObject_local.getString( Constants.KEY_DATE );
                       data.add( date );
                    }
                    else {
                        for( int i = 0; i < 4; i++ ) {
                            data.add( "ERROR" );
                        }
                    }
              }
      }  //JSON object is null
      catch ( JSONException jsone) {
          Log.e( "JSON EXCEPTION", jsone.getMessage() );
      }
          dummyData = data.toArray( dummyData );
      }
      return dummyData;
    

    }

    【讨论】:

      【解决方案4】:

      这是19API lvl下的解决方案:

      • 首先。制作一个 Gson 对象。 --> Gson gson = new Gson();

      • 第二步是使用 StringRequest( 而不是 JsonObjectRequest)

      • 获取 JsonArray 的最后一步...

      YoursObjArray[] yoursObjArray = gson.fromJson(response, YoursObjArray[].class);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 2020-09-08
        • 2018-06-07
        • 2017-12-29
        • 2016-12-17
        • 1970-01-01
        相关资源
        最近更新 更多