如何在Retrofit中使用Gson Converter解析关联数组?

时间:2016-06-17 14:08:55

标签: android json gson retrofit

我从PHP服务器收到JSON响应。在android中,我需要编写一个java模型(POJO)来用于解析Retrofit(一个用于http请求的Android库)中的响应。

JSON结构:

{
  "calendar": {
    "2016-06-10": [
      {
        "time": "10h00m",
        "title": "PROVA P2",
        "description": "LP / RED / ED.FIS - 80 E 90",
        "color": "#990000"
      }
    ],
    "2016-06-11": [
      {
        "time": "10h00m",
        "title": "SIMULADO",
        "description": "LOREM PSIUM DOLOR LOREM",
        "color": "#009900"
      },
      {
        "time": "11h00m",
        "title": "CONSELHO DE CLASSE",
        "description": "LOREM PSIUM DOLOR",
        "color": "#009900"
      }
    ]
  },
  "error": false
}

JSON来自PHP Server。 如何使用 Retrofit 处理它?

3 个答案:

答案 0 :(得分:2)

要使用动态密钥解析JSON,您的Map课程中需要POJO

将以下POJO类添加到项目中:

  1. CalendarResponse.java

    public class CalendarResponse {
      @SerializedName("calendar")
      Map<String, List<Entry>> entries;
    
      @SerializedName("error")
      private boolean error;
    }
    
  2. Entry.java

    public class Entry {
      @SerializedName("time")
      private String time;
    
      @SerializedName("title")
      private String title;
    
      @SerializedName("description")
      private String description;
    
      @SerializedName("color")
      private String color;
    }
    
  3. 在终端的改装界面中使用CalendarResponse类,请参阅下面的示例

    public interface CalendarService {
      @GET("<insert your own relative url>")
      Call<CalendarResponse> listCalendar();
    }
    
  4. 执行呼叫(同步),如下所示:

    Call<CalendarResponse> call = calendarService.listCalendar();
    CalendarResponse result = call.execute().body();
    
  5. 如果需要,以下是使用JSON解析GSON的示例:

    Gson gson = new GsonBuilder().create();
    CalendarResponse b = gson.fromJson(json, CalendarResponse.class);
    

答案 1 :(得分:0)

通常情况下,您会创建一个POJO,它代表您的JSON,但在这种情况下,您需要2016-06-10课程和2016-06-11课程。

这不是解决方案。因此,更改JSON响应以使日期成为单独的值:

{
  "calendar": [
    {
      "date": "2016-06-10",
      "entries": [
        {
          "time": "10h00m",
          "title": "PROVA P2",
          "description": "LP / RED / ED.FIS - 80 E 90",
          "color": "#990000"
        }
      ]
    }
  ]
}

更好的是,只需创建一个dateTime值并使其成为正确的ISO 8601时间戳:

{
  "calendar": [
      {
        "time": "2016-06-10T08:00:00.000Z",
        "title": "PROVA P2",
        "description": "LP / RED / ED.FIS - 80 E 90",
        "color": "#990000"
      }
    ]
}

如果您无法控制服务于JSON的服务器,那么您应该使用Retrofit来获取String并通过gson自己进行Gson转换。

答案 2 :(得分:0)

当我不想为服务器的奇怪响应创建/\[\[([^\]]*(?:](?!])[^\]]*)*)]]/g时,我所做的是将其保存为java中的POJO并解析字符串以创建JSON对象。 (是的,因为有时我们无法控制API人员正在编码的内容......)

正如 Cristan 所说,创建一个JSON类会很奇怪。因此,最好直接将其作为特定情况的2016-06-10对象进行处理。您可以使用JSON容器访问任何属性,甚至可以将其存储在数据库中。

如果您选择该路径,则需要执行以下操作:

JSON