【问题标题】:How to ignore the keys of dynamic response of json object in retrofit 2.0如何在改造 2.0 中忽略 json 对象的动态响应键
【发布时间】:2017-09-15 04:45:10
【问题描述】:

如何忽略使用改造 2.0 和 gson 的两个不同用户的响应所缺少的 json 键。

这是现有用户的 json 响应。

{ 
   "details" :{
       "userId" : "548sdry5687rtyde346asf",
        "email: "avc@zxc.com",
        "name":{
          "first":"Jhon",
          "last": "Madan",
          "_id":"69874154sdfadg58dfa245"},
          "gender":"male",
          "location":{
              "address":"12547",
              "city":"delhi",
              "state":"Delhi"
          }
     }
}

这是给新用户的回复

{
    "details":{
        "userId":"1258afafg287fae23sf",
        "email": "qwea@gmail.com",
        "name":{
              "first":"Mohan",
              "last":"mehar",
              "_id":"kdg2467edfdfh356thdg"}
         }
}

【问题讨论】:

  • 忽略是什么意思?如果密钥不存在,通常 json 库不会崩溃。这些字段将只是空...
  • 嗨 Fred,忽略这个意义上的字段,在新的用户响应中签出,我们没有“位置”对象。为了设置用户配置文件的视图,我们需要从它们各自的 pojo 类中访问字符串。在这种情况下,当我尝试注册一个新用户时,它只包含姓名和电子邮件,它会在位置引发空指针异常,因为新用户不存在位置对象。
  • 嗯,但这不是改造或 gson 的问题。您必须在代码中考虑它可以为 null 并且不显示它的事实
  • 如何将其设为null或不显示..请帮我解决它
  • 同意@Fred。要么创建一个没有这些字段的新 User 类,要么在访问这些字段之前执行 if-not-null 检查。

标签: android json retrofit2 gson


【解决方案1】:

如果您希望您的对象没有字段但不关心 json 是否有:

class A {
    String first;
    //String gender; //good news, Gson doesn't care by default!
}

如果您希望您的对象具有字段,但即使 json 有,也不反序列化它:

class B {
    String first;
    transient String gender; //won't serialize or deserialize
}

如果您希望您的对象有字段,但不关心 json 是否没有:

class C {
    String first;
    @Nullable String gender;  //but this is default anyway
}

如果您担心的是显示数据

public String getGender() {
    //has a default value ("") so no NPE's
    return gender == null? "" : gender;
}

【讨论】:

  • 嗨@Nick Cardoso,感谢您的回答。但是您在 B 类中给出的带有瞬态注释的解决方案,我之前已经尝试过,但它对我不起作用。请帮我解决问题。
  • "用精解决问题"是什么意思?我试图涵盖所有情况,因为您的问题措辞有点不清楚-转换Json -> JavaJava -> Json 是您的问题。你有错误吗?
  • 对于每个用户,我都设置了类似的视图格式,我将字符串设置为视图中的文本视图。因此,如果用户是新用户,他只有姓名和电子邮件。但是在设置视图时,文本视图会询问尚未添加到新用户的性别或位置,但这些键存在于现有用户的 json 响应中。在这种情况下,它会引发一个 NPE,其中文本视图正在请求 json 响应中不存在的字符串。
  • 那么最后一部分(返回默认字符串)就是你需要的部分
【解决方案2】:

如果缺少相应的 JSON 字段,GSON 会将类字段设置为 null。如果您希望能够访问这些字段而不用担心空指针异常,您可以在访问时用空对象懒惰地替换空值。

public String getGender() {
    if (gender != null) return gender;
    else return gender = "";
}

public Location getLocation () {
    if (location != null) return location;
    else return location = new Location("", "", "");
}

【讨论】:

    【解决方案3】:

    JSONObject 类有一个名为“has”的方法:

    http://developer.android.com/reference/org/json/JSONObject.html#has(java.lang.String)

    如果此对象具有名称映射,则返回 true。映射可能为 NULL。

    例子

    if(jsonObject.has("email"))
    {
      returen true
    }
    else
    {
      return false  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多