【问题标题】:Parsing json array without keys in android在android中解析没有键的json数组
【发布时间】:2015-06-04 00:02:58
【问题描述】:

我可以解析这个 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 数组,但没有键或名称“联系人”,如下所示:

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

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

【问题讨论】:

标签: android json parsing


【解决方案1】:

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

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

现在 `entities 包含 ResponseEntity 元素。使用迭代,您可以获得所有实体

谢谢`

【讨论】:

    【解决方案2】:

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

    对象是零个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串、数字、 布尔值、空值、对象或数组。

    因此,没有 API 可以获取没有名称的数组(或任何其他类型),因为那没有任何意义。您在问题中定义的对象没有名称,只有一个值,因此它是无效的。

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

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

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

    JSONArray contactArray = new JSONArray(json);
    

    【讨论】:

    • 那个json仍然无效,email后面有逗号
    【解决方案3】:

    你的 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"
       }
    ]
    

    【讨论】:

    • 这个解决方案有什么问题?再次感谢 SO 在没有任何解释的情况下投了反对票!
    • 问题 #1:“jackson json 库可以处理没有键名的 json”——这是错误的。 jackson json 库不能(也不应该)处理非法的 json 模式。对象中需要键名。说杰克逊可以神奇地处理这件事是非常误导的。
    • 问题 #2:您实际上并没有解释他所做的事情出了什么问题。你只是说“哦,使用这个库,甚至不用担心这些东西是如何工作的。”一个好的答案应该解释到底出了什么问题,以及直接解决它的选项。
    • 我的代码使用 jackson 可以很好地解析这个 json,误导的部分在哪里?
    • 提出的问题是“是否可以解析这个或者 Json 语法不正确?”这两个我都回答了​​
    猜你喜欢
    • 2015-08-15
    • 2021-04-13
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多