【问题标题】:How to parse the JSON response coming from server which is in this format如何解析来自这种格式的服务器的 JSON 响应
【发布时间】:2019-12-26 09:47:36
【问题描述】:

我有一个来自服务器的 JSON 响应,如下所示:

[
    {
        "user_id": 147,
        "ticket_ref_no": "6ef8b3be-b3b7-4ffb-b8ca-6f114d972553",
        "status": "open",
        "created_at": "2019-08-20 17:08:29",
        "updated_at": "2019-08-20 17:08:29",
        "latestMessage": [
            {
                "message": "Created New Ticket for test",
                "ticket_id": 2,
                "user_id": 147,
                "response_by_user_id": null,
                "created_at": "2019-08-20 17:08:29",
                "updated_at": "2019-08-20 17:08:29"
            }
        ]
    },
    {
        "user_id": 147,
        "ticket_ref_no": "d1c022f2-c12b-45ed-8d74-befc4896c5e2",
        "status": "open",
        "created_at": "2019-08-20 17:22:14",
        "updated_at": "2019-08-20 17:22:14",
        "latestMessage": [
            {
                "message": "Help Test",
                "ticket_id": 3,
                "user_id": 147,
                "response_by_user_id": null,
                "created_at": "2019-08-20 17:22:14",
                "updated_at": "2019-08-20 17:22:14"
            }
        ]
    }
]

我想知道如何解析这些数据,如何将这些数据发送到我的适配器,我尝试过使用:

for (int i = 0; i<data.size(); i++)
   dataMessage = new ArrayList<>(Arrays.asList(data.get(i).getLatestMessage()));

但它只传递最后一条消息,我的意思是 dataMessage 会覆盖最新的消息,但我想要 dataMessage 中的所有消息。 谁能有解决方案? TIA

【问题讨论】:

  • 响应来自 JSONArray。
  • 您在使用Retrofit 可以请您发布您的模型和您的ApiService 吗?你怎么称呼它?
  • 使用GSON库解析Json github.com/google/gson
  • @AbhinavGupta 是的,它出现在 JSONArray 中,我也有一个不同的 POJO 类,其中包含 private String updated_at; private String user_id; private String created_at; private LatestMessage[] latestMessage; private String ticket_ref_no; private String status; 这个东西的 getter 和 setter 方法
  • How to parse JSON in Java的可能重复

标签: android arrays json parsing retrofit2


【解决方案1】:

但它只传递最后一条消息,我的意思是 dataMessage 会覆盖最新的消息,但我想要 dataMessage 中的所有消息。谁能有解决方案? TIA

for (int i = 0; i<data.size(); i++)
    dataMessage = new ArrayList<>(Arrays.asList(data.get(i).getLatestMessage()));

问题:

=> 因为您正在迭代循环并将值存储在 dataMessage 变量中,所以显然在循环迭代结束时 dataMessage 将具有最后一个消息值。

解决方案:

无需在循环内初始化 dataMessage,您只需继续添加您在每次迭代中找到的最新消息:

 for (int i = 0; i<data.size(); i++)
        dataMessage.add(data.get(i).getLatestMessage());

【讨论】:

  • 你能告诉我如何使用 ArrayList 来存储这些数据,但我还是想发送 List @Paresh Mayani 类型的数据
  • @ArunSriramula 您只需要继续将值添加到dataMessage ArrayList。检查更新的答案
  • 不。它不起作用,因为我的根 POJO 有 LatestMessage[] 类型元素,dataMessage 有一种 List 没有方括号 @Paresh Mayani
  • @ArunSriramula 那么你需要修改我认为的pojo。
【解决方案2】:

只需将= 更改为add 如下:

for (int i = 0; i<data.size(); i++)
        dataMessage.add(Arrays.asList(data.get(i).getLatestMessage());

你也可以使用

Collections.addAll(dataMessage, data.get(i).getLatestMessage());

【讨论】:

  • 太好了,你给了我一个提示。谢谢@Skizo-ozᴉʞS
  • 我刚刚做了这个dataMessage.addAll(Arrays.asList(data.get(i).getLatestMessage()));,它成功了
  • 我知道最重要的是问题得到了解决。但是,我们应该始终关注问题和解决问题的选项,并且我们应该考虑每个解决方案。我想知道它是如何提示你的,而我的答案不是!
  • @PareshMayani 我不知道怎么做,但是当我看到这个答案时它就点击了,可能是因为在你的答案中没有 Arrays.asList 关键字
  • @PareshMayani 我在阅读 cmets 并阅读您的所有答案时发现了这一点,有时更好地理解您所说的问题,而不是在不知道根本原因的情况下输入任何内容,我在他说:因为我的根 POJO 有 LatestMessage[] 类型元素,而 dataMessage 有 List 类型,没有方括号
【解决方案3】:

创建一个模型类,设置从 json 获取的所有值并将该模型类对象添加到 arrarylist 并将该数组列表发送到适配器

【讨论】:

    【解决方案4】:

    创建一个代表您的 Json 结构的 POJO。使用 GSON 等序列化/反序列化库从 json 加载中获取对象。

    对于您的回复,类似于此的 POJO 模式会有所帮助。

    package com.example;
    
    import java.util.List;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class Example {
    
    @SerializedName("user_id")
    @Expose
    private Integer userId;
    @SerializedName("ticket_ref_no")
    @Expose
    private String ticketRefNo;
    @SerializedName("status")
    @Expose
    private String status;
    @SerializedName("created_at")
    @Expose
    private String createdAt;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
    @SerializedName("latestMessage")
    @Expose
    private List<LatestMessage> latestMessage = null;
    
    public Integer getUserId() {
    return userId;
    }
    
    public void setUserId(Integer userId) {
    this.userId = userId;
    }
    
    public String getTicketRefNo() {
    return ticketRefNo;
    }
    
    public void setTicketRefNo(String ticketRefNo) {
    this.ticketRefNo = ticketRefNo;
    }
    
    public String getStatus() {
    return status;
    }
    
    public void setStatus(String status) {
    this.status = status;
    }
    
    public String getCreatedAt() {
    return createdAt;
    }
    
    public void setCreatedAt(String createdAt) {
    this.createdAt = createdAt;
    }
    
    public String getUpdatedAt() {
    return updatedAt;
    }
    
    public void setUpdatedAt(String updatedAt) {
    this.updatedAt = updatedAt;
    }
    
    public List<LatestMessage> getLatestMessage() {
    return latestMessage;
    }
    
    public void setLatestMessage(List<LatestMessage> latestMessage) {
    this.latestMessage = latestMessage;
    }
    
    }
    -----------------------------------com.example.LatestMessage.java-----------------------------------
    
    package com.example;
    
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    public class LatestMessage {
    
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("ticket_id")
    @Expose
    private Integer ticketId;
    @SerializedName("user_id")
    @Expose
    private Integer userId;
    @SerializedName("response_by_user_id")
    @Expose
    private Object responseByUserId;
    @SerializedName("created_at")
    @Expose
    private String createdAt;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
    
    public String getMessage() {
    return message;
    }
    
    public void setMessage(String message) {
    this.message = message;
    }
    
    public Integer getTicketId() {
    return ticketId;
    }
    
    public void setTicketId(Integer ticketId) {
    this.ticketId = ticketId;
    }
    
    public Integer getUserId() {
    return userId;
    }
    
    public void setUserId(Integer userId) {
    this.userId = userId;
    }
    
    public Object getResponseByUserId() {
    return responseByUserId;
    }
    
    public void setResponseByUserId(Object responseByUserId) {
    this.responseByUserId = responseByUserId;
    }
    
    public String getCreatedAt() {
    return createdAt;
    }
    
    public void setCreatedAt(String createdAt) {
    this.createdAt = createdAt;
    }
    
    public String getUpdatedAt() {
    return updatedAt;
    }
    
    public void setUpdatedAt(String updatedAt) {
    this.updatedAt = updatedAt;
    }
    
    }
    

    使用http://www.jsonschema2pojo.org/转换。

    【讨论】:

    • 我已经有相同的 POJO,我也使用相同的网站将响应转换为 POJO
    猜你喜欢
    • 2013-08-05
    • 2011-02-10
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2014-02-04
    • 2013-08-08
    相关资源
    最近更新 更多