2017-09-15 3 views
3

retrofit 2.0とgsonを使用して2人の異なるユーザーの応答に欠けているjsonのキーを無視する方法。改造中のjsonオブジェクトの動的応答のキーを無視する方法2.0

これは既存ユーザーのjsonレスポンスです。

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

これは、対応するJSONフィールドが不足している場合GSONはnullに、クラスのフィールドを設定します新しいユーザーの応答

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

あなたは無視するとはどういう意味ですか?キーが存在しない場合、通常、jsonライブラリはクラッシュしません。フィールドはnullになります... – Fred

+0

こんにちはフレッド、意味のフィールドを無視し、新しいユーザーの応答をチェックアウト、そこには "場所"オブジェクトがありません。ユーザープロファイルのビューを設定するには、それぞれのpojoクラスから文字列にアクセスする必要があります。このケースでは、新しいユーザーを登録しようとしていますが、名前と電子メールのみで構成されている場所では、場所オブジェクトが新しいユーザーには存在しないため、nullポインタ例外が発生しています。 – SirishaReddy

+1

さて、レトロフィットやグソンには問題ありません。ヌルで表示できないという事実については、コード内で説明する必要があります。 – Fred

答えて

-1

です。 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("", "", ""); 
} 
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 
} 

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

こんにちは@Nick Cardoso、答えに感謝します。しかし、クラスBで一時的な注釈を付けてくれた解決策は、以前はそれを試していましたが、それは私のためには機能しませんでした。問題の解決に役立ちます。 – SirishaReddy

+0

「問題解決の解決策」これはどういう意味ですか?あなたの質問の文言が少し不明であるので、私はすべてのケースをカバーしようとしました。あなたの問題は 'Json - > Java'か' Java - > Json'です。エラーがありますか? –

+0

私はビューのための同様のフォーマットを解決したすべてのユーザーのために、私はビュー内のテキストビューに文字列を設定しています。したがって、ユーザーが新規の場合、彼は名前と電子メールのみを持ちます。しかし、ビューを設定している間、テキストビューは新しいユーザーにまだ追加されていない性別や場所を要求していますが、既存のユーザーjsonレスポンスのために存在します。この場合、テキストビューがjsonレスポンスにはない文字列を要求しているNPEが呼び出されています。 – SirishaReddy

-1

JSONObjectクラスは「という名前のメソッドを持っているフィールドを持ってではなく、JSONがない場合は気にするあなたのオブジェクト「:

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

trueを返します。このオブジェ場合ctにはnameのマッピングがあります。マッピングはNULLでもかまいません。

if(jsonObject.has("email")) 
{ 
    returen true 
} 
else 
{ 
    return false 
} 
関連する問題