【问题标题】:How to parse JSON Array (Not Json Object) in Android如何在 Android 中解析 JSON 数组(不是 Json 对象)
【发布时间】:2013-09-29 09:44:02
【问题描述】:

我很难找到解析 JSONArray 的方法。 它看起来像这样:

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

如果 JSON 的编写方式不同,我知道如何解析它(换句话说,如果我返回的是 json 对象而不是对象数组)。 但这就是我所拥有的,而且必须坚持下去。

*编辑:这是一个有效的 json。我使用这个 json 制作了一个 iPhone 应用程序,现在我需要为 Android 做它并且无法弄清楚。 那里有很多示例,但它们都与 JSONObject 相关。我需要一些 JSONArray 的东西。

有人可以给我一些提示,或者教程或示例吗?

非常感谢!

【问题讨论】:

  • 试试这个看看你的json是否有效json.parser.online.fr
  • 您是否使用任何库来解析 json?使用 gson 库进行 json 解析。非常有帮助。
  • 有效。我在我为 iPhone 做的应用程序中解析了它并且它正在工作。我只是不知道如何在 Android 中做到这一点
  • @nikash,是的,我注意到我可以使用 gson。唯一的问题是,我发现的所有示例都是用于解析 JSONObject 而不是 JSONArray
  • 发布您迄今为止尝试过的代码。相应地给出准确的答案会有所帮助。

标签: java android json gson arrays


【解决方案1】:

使用下面的sn-p来解析JsonArray。

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

【讨论】:

  • 只有一个问题,如果 jsonarray 包含像 [2].[4] 这样的数字并且里面的数字再次包含一个数组,所以如果我想从中检索特别是可以说嵌套在 java 代码中的数字 [4] 中的数组,我必须写 int i=4???
  • @BiggDawgg:很高兴它帮助了你。将您的问题与 JSON 数据一起发布在单独的线程中,以便我轻松回答。
【解决方案2】:

我只举一个Jackson 的例子:

首先创建一个数据持有者,其中包含来自 JSON 字符串的字段

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

并解析 MyDataHolders 列表

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

使用列表项

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

【讨论】:

  • 你能给我举个例子,我如何从我拥有的 url 中获取 JSON 作为字符串?
  • DefaultHttpClients 执行方法是一个阻塞调用,所以它必须在后台任务中完成,以明确它为什么在单独的类中。
  • 我收到有关 HttpGetTask 构造函数的错误。 "构造函数 HttpGetTask(OnHttpGetCompletedListener) 指的是缺少的类型 OnHttpGetCompletedListener"
  • 你导入了 OnHttpGetCompletedListener 了吗?像这样import your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
  • 是的,这就是问题所在...感谢您解决我的问题 :)
【解决方案3】:
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

输出:

name1
url1
name2
url2

【讨论】:

    【解决方案4】:

    创建一个类来保存对象。

    public class Person{
       private String name;
       private String url;
       //Get & Set methods for each field
    }
    

    然后反序列化如下:

    Gson gson = new Gson();
    Person[] person = gson.fromJson(input, Person[].class); //input is your String
    

    参考文章:http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/

    【讨论】:

    • 我假设这个“输入”将是那个 json 的 URL?还是别的什么?
    • 这是一个非常简单的解决方案。在我看来它应该是公认的
    【解决方案5】:

    在这个例子中,一个 json 数组中有几个对象。也就是说,

    这是 json 数组:[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

    这是一个对象:{"name":"name1","url":"url1"}

    假设你已经得到了一个名为 jSonResultString 的字符串变量:

    JSONArray arr = new JSONArray(jSonResultString);
    
      //loop through each object
      for (int i=0; i<arr.length(); i++){
    
      JSONObject jsonProductObject = arr.getJSONObject(i);
      String name = jsonProductObject.getString("name");
      String url = jsonProductObject.getString("url");
    
    
    }
    

    【讨论】:

    • 我很难从 URL 获取我的 JSONstring。也许你可以帮忙?
    • 谢谢你用例子来分解它,很清楚
    【解决方案6】:
    public class CustomerInfo 
    {   
        @SerializedName("customerid")
        public String customerid;
        @SerializedName("picture")
        public String picture;
    
        @SerializedName("location")
        public String location;
    
        public CustomerInfo()
        {}
    }
    

    当你得到结果时;像这样解析

    List<CustomerInfo> customers = null;
    customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());
    

    【讨论】:

    • 结果变量是你的 JSONArray 字符串
    • 结果变量是我需要从中获取 json 还是已经获取 json 的 url?
    • 迄今为止最简单的解决方案
    【解决方案7】:

    已经提到了一些很好的建议。 使用 GSON 确实很方便,为了让生活更轻松,你可以试试这个website 它被称为 jsonschema2pojo 并且正是这样做的:

    你给它你的json,它会生成一个java对象,可以粘贴到你的项目中。 您可以选择 GSON 来注释您的变量,因此从您的 json 中提取对象变得更加容易!

    【讨论】:

      【解决方案8】:

      我的情况 从服务器加载示例..

      int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
                  if (jsonLength != 1) {
                      for (int i = 0; i < jsonLength; i++) {
                          JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                          JSONObject resJson = (JSONObject) jsonArray.get(i);
                          //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                      }
      

      【讨论】:

      • p.s "jsonObject.getString("messages")" 类型是 jsonArray;第一个存在的答案是不能将字符串转换为 jsonArray;我修好了。
      【解决方案9】:

      为列表中的对象创建一个 POJO Java 类,如下所示:

      class NameUrlClass{
             private String name;
             private String url;
             //Constructor
             public NameUrlClass(String name,String url){
                    this.name = name;
                    this.url = url; 
              }
      }
      

      现在只需创建一个 NameUrlClass 列表并将其初始化为 ArrayList,如下所示:

      List<NameUrlClass> obj = new ArrayList<NameUrlClass>;
      

      您可以使用将 JSON 数组存储在此对象中

      obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]
      

      【讨论】:

      • 不清楚obj = JSONArray; 应该做什么。在这种情况下,JSONArray 是什么?它从何而来?用new ArrayList&lt;NameUrlClass&gt; 初始化obj 的目的是什么,当你之后直接替换它时?
      【解决方案10】:

      我知道旧帖子,但除非我误解了这个问题,否则这应该可以解决问题:

      s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
      eval("array=" + s);
      for (var i = 0; i < array.length; i++) {
      for (var index in array[i]) {
          alert(array[i][index]);
      }
      

      }

      【讨论】:

        【解决方案11】:
                    URL url = new URL("your URL");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.connect();
                    InputStream stream = connection.getInputStream();
                    BufferedReader reader;
                    reader = new BufferedReader(new InputStreamReader(stream));
                    StringBuffer buffer = new StringBuffer();
                    String line = "";
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }
        
                    //setting the json string
                    String finalJson = buffer.toString();
        
                    //this is your string get the pattern from buffer.
                    JSONArray jsonarray = new JSONArray(finalJson);
        

        【讨论】:

          猜你喜欢
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          • 2015-04-28
          • 2016-08-09
          相关资源
          最近更新 更多