在android中解析没有键的json数组

时间:2015-03-30 20:03:06

标签: android json parsing

我可以解析这个json,存储在一个名为json的字符串中。

{
 "contacts": [
    {
            "id": "c200",
            "name": "Ravi Tamada",
            "email": "ravi@gmail.com",
    },
    {
            "id": "c201",
            "name": "Johnny Depp",
            "email": "johnny_depp@gmail.com",
    }
 ]
}

在Android中使用此代码:

JSONObject object = new JSONObject(json);
JSONArray ob = object.getJSONArray("contacts");

问题是我要解析相同的JSON数组,但没有键或名称“contacts”,如下所示:

{
 [
    {
            "id": "c200",
            "name": "Ravi Tamada",
            "email": "ravi@gmail.com",
    },
    {
            "id": "c201",
            "name": "Johnny Depp",
            "email": "johnny_depp@gmail.com",
    }
 ]
}

方法getJSONArray()需要数组的名称,但在这种情况下它没有数组。有可能解析这个或者Json语法不对吗?

3 个答案:

答案 0 :(得分:0)

getJSONArray需要一个名称,因为the JSON spec

  

对象是零个或多个名称/值的无序集合      对,其中名称是字符串,值是字符串,数字,      boolean,null,object或array。

因此,没有API来获取没有名称的数组(或任何其他类型),因为这没有任何意义。您问题中定义的对象没有名称,只有值,因此无效。

如果您只希望传递数组,请删除大括号 - 您的JSON应如下所示:

 [
    {
            "id": "c200",
            "name": "Ravi Tamada",
            "email": "ravi@gmail.com"
    },
    {
            "id": "c201",
            "name": "Johnny Depp",
            "email": "johnny_depp@gmail.com"
    }
 ]

没有理由使用杰克逊。你可以像这样解析上面的String:

JSONArray contactArray = new JSONArray(json);

答案 1 :(得分:0)

您可以使用gson库轻松完成。这是代码示例: 您需要两个实体类,一个是Holder类,另一个是实体类。 实体类将是这样的:

 public class ResponseEntity {
    @SerializedName("id")
    public String id;
    @SerializedName("name")
    public String name;
    @SerializedName("email")
    public String email;
}


public class ResponseRoot{
    @SerializedName("contacts")
    public List<ResponseEntity> entities=null;

public ResponseRoot(){
    entities=new ArrayList<ResponseEntity>();
}
}

现在使用GSON库转换此json数组。

Gson gson=new Gson();    
ResponseRoot entities = (ResponseRoot)gson.fromJson(yourResponseAsString.toString(),
      ResponseRoot.class);

现在`实体包含ResponseEntity元素。使用迭代,你可以得到所有的enitiies

Thanks`

答案 2 :(得分:-1)

你的json应该像这样: -

[
   {
      "id":"c200",
      "name":"Ravi Tamada",
      "email":"ravi@gmail.com"
   },
   {
      "id":"c201",
      "name":"Johnny Depp",
      "email":"johnny_depp@gmail.com"
   }
]

jackson json库可以处理没有键名的json

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static void main(final String... args) throws IOException {

        // read json file data to String
        byte[] jsonData = Files.readAllBytes(Paths.get("contacts.json"));

        // create ObjectMapper instance
        final ObjectMapper objectMapper = new ObjectMapper();

        // convert json string to object
        final Holder holder = objectMapper.readValue(jsonData, Holder.class);

        for (final Contact contact : holder.getContacts()) {
            System.out.println("id = " + contact.getId());
            System.out.println("name = " + contact.getName());
            System.out.println("email = " + contact.getEmail());
        }
    }
}


import com.fasterxml.jackson.annotation.JsonCreator;

public class Holder {

    private final Contact[] contacts;

    @JsonCreator
    public Holder(final Contact[] contacts) {
        super();
        this.contacts = contacts;
    }

    public Contact[] getContacts() {
        return contacts;
    }

}


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Contact {

    private final String id;
    private final String name;
    private final String email;

    @JsonCreator
    public Contact(@JsonProperty("id") final String id, @JsonProperty("name") final String name, @JsonProperty("email") final String email) {
        super();
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

}

contacts.json的内容是

[
   {
      "id":"c200",
      "name":"Ravi Tamada",
      "email":"ravi@gmail.com"
   },
   {
      "id":"c201",
      "name":"Johnny Depp",
      "email":"johnny_depp@gmail.com"
   }
]