2017-09-15 45 views
3

如何忽略使用retrofit 2.0和gson对两个不同用户的响应缺少的json键。如何忽略改进2.0中的json对象的动态响应的按键

这是现有用户的json响应。

{ 
    "details" :{ 
     "userId" : "548sdry5687rtyde346asf", 
     "email: "[email protected]", 
     "name":{ 
      "first":"Jhon", 
      "last": "Madan", 
      "_id":"69874154sdfadg58dfa245"}, 
      "gender":"male", 
      "location":{ 
       "address":"12547", 
       "city":"delhi", 
       "state":"Delhi" 
      } 
    } 
} 

这是新用户的响应

{ 
    "details":{ 
     "userId":"1258afafg287fae23sf", 
     "email": "[email protected]", 
     "name":{ 
       "first":"Mohan", 
       "last":"mehar", 
       "_id":"kdg2467edfdfh356thdg"} 
     } 
} 
+0

你是什么意思忽略?如果键不存在,通常json库不会崩溃。这些字段将是空的... – Fred

+0

嗨弗雷德,忽略在这个意义上的字段,检查出新的用户响应,那里我们没有“位置”对象。为了设置用户配置文件的视图,我们需要从各自的pojo类访问字符串。在这种情况下,当我尝试注册一个新用户时,它只包含名称和电子邮件,它在位置引发空指针异常,因为位置对象不存在新用户。 – SirishaReddy

+1

好吧,但这不是改造或gson的问题。你必须在你的代码帐户,因为它可以为空,而不是显示它 – Fred

回答

-1

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

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

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

如果你想你的对象不要有外地,但不介意的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; 
} 
+0

Hi @Nick Cardoso,谢谢你的回答。但是,您在B类中给出的解决方案使用了短暂的注释,我之前尝试过,但它不适合我。请用我的解决方案来帮助我解决问题。 – SirishaReddy

+0

“用优良解决方案解决问题”是什么意思?我试图涵盖所有的情况,因为你的问题措辞有点不清楚 - 你的问题是转换'Json - > Java'或者Java - > Json'。你有错误吗? –

+0

对于每个用户,我已经为视图安排了类似的格式,我将字符串设置为视图中的文本视图。所以如果用户是新的,他只有姓名和电子邮件。但是,在设置视图时,文本视图正在询问尚未添加到新用户的性别或位置,但这些键存在于现有的用户json响应中。在这种情况下,它正在提出一个NPE,其中文本视图要求json响应中不存在的字符串。 – SirishaReddy