如何在Android中解析JSON数组(非Json对象)


89

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

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

如果JSON的写法不同,我知道如何解析(换句话说,如果我返回了json对象而不是对象数组)。但这就是我所必须拥有的。

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

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

非常感激 !


1
试试这个看看你的json是否有效json.parser.online.fr
An-droid

您在使用任何库来解析json吗?使用gson库进行json解析。
nilkash13 2013年

是有效的。我在为iPhone设计的应用程序中对其进行了解析,并且可以正常工作。我只是不知道如何在Android中进行操作
SteBra 2013年

1
@nikash,是的,我注意到我可以使用gson。唯一的问题是,所有的例子,我发现是用于解析一个JSONObject不JSONArray
SteBra

发布您到目前为止尝试过的代码。据此给出准确的答案将非常有帮助。
Spring Breaker 2013年

Answers:


144

使用以下代码片段解析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 2015年

@BiggDawgg:很高兴为您提供帮助。在带有JSON数据的单独线程中发布您的问题,以便我轻松回答。
Spring Breaker 2015年

26

我仅举一个杰克逊的例子:

首先创建一个数据持有人,其中包含来自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作为字符串?
SteBra

1
DefaultHttpClient的execute-方法是阻塞调用,这样它在后台任务做,只是为了清楚,为什么它是在单独的类。
vilpe89

我被告知有关HttpGetTask构造函数的错误。“构造函数HttpGetTask(OnHttpGetCompletedListener)引用缺少的类型OnHttpGetCompletedListener”
SteBra 2013年

1
您导入了OnHttpGetCompletedListener吗?像这样import your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89'2013/09/

1
是的,这就是问题所在……感谢您解决我的问题:)
SteBra

19
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

12

创建一个类来保存对象。

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?或者是别的什么?
SteBra

这是一个非常简单的解决方案。在我看来,它应该是被接受的产品
FabioC

6

@Stebra参见此示例。这可能对您有帮助。

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());

1
结果变量是您的JSONArray字符串
nilkash 2013年

结果变量将是我需要从json还是已经获取json的URL?
SteBra

到目前为止,最简单的解决方案
0x6C38'9

6

在此示例中,一个json数组中有多个对象。那是,

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

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

假设您已将结果获取到名为jSonResultString的String变量:

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。也许您可以帮上忙吗?
SteBra 2013年

感谢您用示例,清晰的内容对它进行分解
ryvianstyron

3

已经提到了一些很棒的建议。使用GSON确实非常方便,要使生活更加轻松,您可以尝试以下网站 :jsonschema2pojo,它确实做到了:

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


2

我的案例从服务器加载示例。

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"));
                }

希望对你有帮助


ps“ jsonObject.getString(” messages“)”类型为jsonArray; 首先存在的答案是不能将字符串转换为jsonArray;我会解决。
2015年

-1

为列表中的对象创建一个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"},...]

1
目前尚不清楚该怎么obj = JSONArray;办。什么是JSONArray在这种情况下?它从何而来?什么是初始化的目的objnew ArrayList<NameUrlClass>,当你直接更换之后反正?
Max Vollmer

-3

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

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]);
}

}


-3
            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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.