2016-06-15 13 views
4

私は、public T getValue (Class<T> valueType)を使用して、任意のJavaクラスに単純なDataSnapshotオブジェクトを解析する方法を知っています。しかし、Firebase 3.0の後には、Javaクラスに対して以下のデータを解析することができません。これは、NULLを受け取るカスタムタイプのインスタンスが含まれているためです。getValue()を使用してDataSnapshotからFirebaseのJavaクラスを解析する

注:Firebase 3.0以前は同じロジックが正常に動作していました。 FirebaseがJACKSONの代わりにGSONを使用しているからだと思います。私が間違っているなら、私を修正してください

DATA:

{ 
    "address" : "DHA karachi", 
    "addresstitle" : "DHA karachi", 
    "logoimage" : { 
    "bucketname" : "test2pwow", 
    "id" : "zubairgroup", 
    "mediaType" : "image/png", 
    "source" : 1, 
    "url" : "https://pwowgroupimg.s3.amazonaws.com/zubairgroup1173.png?random=727" 
    }, 
    "title" : "zubairghori" 
} 

Group.java

public class Group { 

    public String address; 
    public String addresstitle; 
    public LogoImage logoimage; 

    public Group(){} 

} 

LogoImage.java

public class LogoImage { 

    public String bucketname; 
    public String id; 

    public LogoImage(){} 

} 

コード読んでいる:

Group group = datasnapshot.getValue(Group.class); 

それはlogoimageオブジェクトにデータベースのLogoImage一部をキャストしません。 logoimageオブジェクトでは常にnullを取得します。

+1

* firebaserはこちら* FirebaseはGSONを使用していません。 APKサイズに与える影響を軽減するために、最新のリリースでジャクソンへの依存を取り除いただけです。どの部分がここで問題を引き起こしていますか?これらのクラスでデータを読み取る最小限のコードを表示できますか? –

+0

このコード行を使用してこのデータをGroupに解析することはできません。 'Group group = datasnapshot.getValue(Group。クラス); ' データベースのLogoImage部分をロゴイメージオブジェクトにキャストしません。私たちは常にlogoimageオブジェクトでnullを取得します。 –

+0

私は試してみるとあなたのコードが動作することを示すために以下の無回答を追加しました。文字通りJSONをデータベースにインポートし、クラスをテストプロジェクトにコピーしました。なぜ私は同じコードを使っているのですが、なぜ結果が得られないのか分かりません。 : -/ –

答えて

5

なぜあなたに問題が起こっているのかわかりません。

DatabaseReference ref = database.getReference("37830692"); 
    ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Group group = dataSnapshot.getValue(Group.class); 
      System.out.println(group); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Screenshot of values showing in the debugger

+0

これはGroupクラスのスクリーンショットを投稿した場合には完璧な答えです。 – Sotti

+1

この回答はほぼ一歳です。しかし、私は単純に質問から 'Group'クラスを使用したと確信しています。 –

7

公共TのgetValue(クラスVALUETYPE)

1.クラスがかかるデフォルトコンストラクタを持っている必要があります。このコードは、提供されたデータを私のために正常に動作します引数なし

2.クラスはで、プロパティの公開ゲッターを定義する必要があります。割り当てられる。それは私が同じ問題を抱えています

detail

1

お手伝いします this source:インスタンスが

を直列化復元されたときにパブリックゲッターのないプロパティからそれをチェックし、そのデフォルト値に設定されます。 しかし、セッターものすべての値のゲッターを提供するだけで解決しました。お役に立てれば。

+0

私はあなたのクラス名の上にこの行を追加してみてください。例: @IgnoreExtraProperties パブリッククラスLogoImage { public String bucketname; public String id; public LogoImage(){} } –

1

私は同じ問題を抱えており、コンストラクタの引数がFirebaseに保存されている要素と同じであることを確認して解決しました。私の間違いは、Firebaseのキーを大文字と小文字のオブジェクト引数で設定していたことでした。

関連する問題