com.firebase.client.FirebaseException:未能分析类名称为android的节点

com.firebase.client.FirebaseException:未能分析类名称为android的节点,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,使用updateChildren方法更新Firebase中的现有值时,我遇到以下异常 com.firebase.client.FirebaseException: Failed to parse node with class class com.shajeelafzal.quicktasks_app.models.HashTagModel at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.jav

使用
updateChildren
方法更新Firebase中的现有值时,我遇到以下异常

com.firebase.client.FirebaseException: Failed to parse node with class class com.shajeelafzal.quicktasks_app.models.HashTagModel
  at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:84)
  at com.firebase.client.snapshot.NodeUtilities.NodeFromJSON(NodeUtilities.java:12)
  at com.firebase.client.utilities.Validation.parseAndValidateUpdate(Validation.java:127)
  at com.firebase.client.Firebase.updateChildren(Firebase.java:438)
  at com.shajeelafzal.quicktasks_app.fragments.AddEditTaskFragment$4.onDataChange(AddEditTaskFragment.java:408)
我的模型如下所示:

public class HashTagModel implements Parcelable {

    private HashMap<String, Object> timeStampLastUsed;
    @Expose
    private String name;
    @Expose
    private String createByUserEmail;
    private List<String> tasksKeys;

    public HashTagModel() {
    }

    public HashTagModel(HashMap<String, Object> timeStampLastUsed, String name,
                        String createByUserEmail, ArrayList<String> tasksKeys) {
        this.timeStampLastUsed = timeStampLastUsed;
        this.name = name;
        this.createByUserEmail = createByUserEmail;
        this.tasksKeys = tasksKeys;
    }
}
public void onDataChange(DataSnapshot dataSnapshot) {
    /** if the hash tag does not exists already then create new one. */
    if (dataSnapshot.getValue() == null) {
        HashMap<String, Object> timestampJoined = new HashMap<>();
        timestampJoined.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP);

        ArrayList<String> keysList = new ArrayList<String>();
        keysList.add(key);

        HashTagModel hashTag = new HashTagModel(timestampJoined, "#" + mHashTags.get(finalI),
                Utils.decodeEmail(mEncodedEmail), keysList);
        finalHashTagLocation.setValue(hashTag);
    } else {

        HashTagModel hashtaghModel = dataSnapshot.getValue(HashTagModel.class);

        hashtaghModel.getTasksKeys().add(key);

        /* HashMap for data to update */
        HashMap<String, Object> updateUserTaskData = new HashMap<>();


        Utils.updateMapForAllWithValue(null, mHashTags.get(finalI), mEncodedEmail,
                updateUserTaskData, "", hashtaghModel, Constants.FIREBASE_LOCATION_USER_HASH_TAGS);


        /** update the Hash Tag */
        finalHashTagLocation.updateChildren(updateUserTaskData, new Firebase.CompletionListener() {
            @Override
            public void onComplete(FirebaseError firebaseError, Firebase firebase) {
                Log.i("", "");
            }
        });
    }

    getActivity().finish();
}
我的
onDateChange
方法如下所示:

public class HashTagModel implements Parcelable {

    private HashMap<String, Object> timeStampLastUsed;
    @Expose
    private String name;
    @Expose
    private String createByUserEmail;
    private List<String> tasksKeys;

    public HashTagModel() {
    }

    public HashTagModel(HashMap<String, Object> timeStampLastUsed, String name,
                        String createByUserEmail, ArrayList<String> tasksKeys) {
        this.timeStampLastUsed = timeStampLastUsed;
        this.name = name;
        this.createByUserEmail = createByUserEmail;
        this.tasksKeys = tasksKeys;
    }
}
public void onDataChange(DataSnapshot dataSnapshot) {
    /** if the hash tag does not exists already then create new one. */
    if (dataSnapshot.getValue() == null) {
        HashMap<String, Object> timestampJoined = new HashMap<>();
        timestampJoined.put(Constants.FIREBASE_PROPERTY_TIMESTAMP, ServerValue.TIMESTAMP);

        ArrayList<String> keysList = new ArrayList<String>();
        keysList.add(key);

        HashTagModel hashTag = new HashTagModel(timestampJoined, "#" + mHashTags.get(finalI),
                Utils.decodeEmail(mEncodedEmail), keysList);
        finalHashTagLocation.setValue(hashTag);
    } else {

        HashTagModel hashtaghModel = dataSnapshot.getValue(HashTagModel.class);

        hashtaghModel.getTasksKeys().add(key);

        /* HashMap for data to update */
        HashMap<String, Object> updateUserTaskData = new HashMap<>();


        Utils.updateMapForAllWithValue(null, mHashTags.get(finalI), mEncodedEmail,
                updateUserTaskData, "", hashtaghModel, Constants.FIREBASE_LOCATION_USER_HASH_TAGS);


        /** update the Hash Tag */
        finalHashTagLocation.updateChildren(updateUserTaskData, new Firebase.CompletionListener() {
            @Override
            public void onComplete(FirebaseError firebaseError, Firebase firebase) {
                Log.i("", "");
            }
        });
    }

    getActivity().finish();
}
public void onDataChange(DataSnapshot DataSnapshot){
/**如果哈希标记不存在,则创建一个新的哈希标记*/
if(dataSnapshot.getValue()==null){
HashMap timestampJoined=新的HashMap();
timestampJoined.put(Constants.FIREBASE\u PROPERTY\u TIMESTAMP,ServerValue.TIMESTAMP);
ArrayList keysList=新建ArrayList();
keysList.add(key);
HashTagModel hashTag=新的HashTagModel(timestagJoined,“#”+mHashTags.get(finalI),
Utils.decodemail(mEncodedEmail),键列表;
finalHashTagLocation.setValue(hashTag);
}否则{
HashTagModel hashtaghModel=dataSnapshot.getValue(HashTagModel.class);
hashtaghModel.getTasksKeys().add(key);
/*要更新的数据的HashMap*/
HashMap updateUserTaskData=新HashMap();
Utils.updateMapForAllWithValue(null,mHashTags.get(finalI),mEncodedEmail,
updateUserTaskData“”,hashtaghModel,Constants.FIREBASE\u LOCATION\u USER\u HASH\u TAGS);
/**更新哈希标记*/
finalHashTagLocation.updateChildren(updateUserTaskData,新Firebase.CompletionListener()){
@凌驾
未完成的公共void(FirebaseError FirebaseError,Firebase Firebase){
Log.i(“,”);
}
});
}
getActivity().finish();
}

setValue()
方法不同,
updateChildren()
不会对传入的值执行Java到JSON的转换。

您正在将一个
HashMap
传递到
updateChildren()
,这符合该API的约定。但我很确定在某些值中有一个Java对象(可能是
HashTagModel
),它没有直接映射到JSON类型

但您可以通过以下方式将POJO转换为地图:

Map<String, Object> hashtaghMap = new ObjectMapper().convertValue(hashtaghModel, Map.class);
Map hashtaghMap=new ObjectMapper().convertValue(hashtaghModel,Map.class);

然后,您可以将值映射放入传递到
updateChildren()

的值中。请包含Firebase数据库中的实际JSON文本。您可以通过单击Firebase仪表板中的导出按钮获得它,它将允许我们复制/粘贴JSON以进行测试(或将其粘贴到答案中)。@FrankvanPuffelen i添加了JSON文本。谢谢。我们还缺少写入Firebase的代码(在
onDataChange()
中)。是否真的需要
HashTagModel
类(它需要这么大)来重现问题?@FrankvanPuffelen我可以删除可打包的代码。我想我可以帮助理解。我正在添加应该更新的代码。我很确定您受到了与此处所述相同的问题的影响:。不能将Java类传递到
updateChildren()
中。我对这个问题的回答有一个解决办法。谢谢@FrankvanPuffelen@FrankvanPuffelen既然FirebaseDatabase不再使用jackson,那该怎么办?我们是否应该将其作为依赖项导入以实现相同的结果?我宁愿不这样做,因为从我读到的内容来看,它被移除的原因之一是担心最终的apk大小。(参考)如果您发现我们新的序列化/反序列化无法满足您的需求,您可以使用Jackson。请参阅以了解如何做到这一点。别忘了让我们知道你的用例,这样我们就可以考虑增加对它的支持。我的用例与这个答案完全相同:使用updateChildren而不需要手动将pojo转换为映射。您建议使用ObjectMapper,但它是一个Jackson类,所以我想知道我们是否可以使用FirebaseDatabase API实现相同的结果。我错过什么了吗?(请原谅我的无知,为什么updateChidren不像setValue那样允许POJO?如果有一个相应的方法可以允许POJO,我会请求支持:)@FrankvanPuffelen我也支持@Ena上面的问题。是否有任何方法可以使用
updateChildren
,而无需手动将对象转换为地图?