【问题标题】:retrieve firebase data as json以 json 格式检索 firebase 数据
【发布时间】:2017-12-06 00:38:06
【问题描述】:

我想检索存储在 firebase 数据库中但以正确的 Json 格式存储的数据,问题是使用 String.valueOf(dataSnapshot.getValue()) 时它不是正确的 json 格式。 例如,如果数据

{
  "properties" : {
     "last_update" : "15-02-2017 02:48:00 pm",
     "last_update_code" : "1258884"  
  } 
}

返回值变成这样

properties = {last_update = 15-02-2017 02:48:00 pm,last_update_code = 1258884}

不带引号或 (:)。

那么有没有办法以第一种格式将数据作为字符串获取?

【问题讨论】:

    标签: java android json firebase firebase-realtime-database


    【解决方案1】:

    这就是我所做的。 首先,从 DataSnapshot 创建一个 java 对象,然后使用 Gson 从该对象获取 JSON。

    Object object = datasnapshot.getValue(Object.class);
    String json = new Gson().toJson(object);
    

    【讨论】:

    • 完美。无需创建不必要的 Pojo 类来获取 json 响应。这个答案的 Kotlin 版本 val object = dataSnapshot.getValue(Any::class.java) val json = Gson().toJson(object)
    【解决方案2】:

    当您尝试将 json 转换为 String 时,您将获得返回值。

    因此,您可以使用以下方法之一,而不是这样做:-

    首先:-

    String lastUpdate = dataSnapshot.child(last_update).getValue(String.class);
    String last_update_code = dataSnapshot.child(last_update_code).getValue(String.class);
    

    第二个:-

    定义一个映射到您的 Json 的 POJO。之后,使用以下代码。

    YourPOJO yourPOJO = dataSnapshot.getValue(YourPOJO.class);
    

    您可以阅读更多关于它的信息here

    【讨论】:

    • 考虑到第一个解决方案,如果是嵌套节点,我认为它不会起作用,关于我现在正在尝试的 pojo 类,会告诉你,谢谢!
    • 如果有嵌套节点,则直接调用dataSnapshot.child(first_child_node).child(second_child_node).getValue()
    • 但是,使用 POJO 类通常是最好的方法!
    • 我尝试了 pojo 类,效果很好,也很简单,谢谢!
    • 太棒了!我很高兴能帮上忙。
    【解决方案3】:

    一种方法是使用Gson 将结果转换为json字符串,例如

    String jsonString = gson.toJson(dataSnapshot.getValue());
    

    【讨论】:

    • 我试过了,但我认为它不适用于嵌套节点
    • 有点乱,但你也可以用PojoClassPojoClass myPojo = dataSnapshot.getValue(PojoClass.class) 是映射到你的json 的java 类.....然后使用gson 来转换它。
    【解决方案4】:

    显然 pojo 类是实现我目标的最简洁和最简单的方法

    第一

    创建了代表我的 json 文件的类:

    对于那个 json 文件:

    {“数据”:{ “文本” : { “加载”:{ “介绍文本”:“嗨” } } } }

    创建这些类:

    pojo,数据,文本,加载之类的:

    public class Pojo{
        private Data data;
    
        public void setData(Data data){
            this.data = data;
        }
        public Data getData(){
            return this.data;
        }
    
    public class Data {
        private Text text;
    
        public void setText(Text text){
            this.text = text;
        }
        public Text getText(){
            return this.text;
        }
    }
    
    public class Text {
        private Loading loading;
    
        public void setLoading(Loading loading){
            this.loading = loading;
        }
        public Loading getLoading(){
            return this.loading;
        }
    }
    
    public class Loading {
        private String intro_text;
    
        public void setIntro_text(String intro_text){
            this.intro_text = intro_text;
        }
        public String getIntro_text(){
            return this.intro_text;
    }
    

    }

    第二

    在这部分文件上应用这个方法 假设 (data) 是 json 文件中的第一个子节点,所以 is ref = "" (没有 ref 因为它是第一个节点)

     Database database = FirebaseDatabase.getInstance();
     DatabaseReference databaseReference = database.getReference("");
     databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Pojo pojo = dataSnapshot.getValue(Pojo.class);
            Gson gson = new Gson();
            String reqJson= gson.toJson(pojo);
            return reqJson
        }
    

    【讨论】:

      【解决方案5】:

      另一种可能的方法是使用基于 URL 的数据读取。如果您知道包含 json 文件的根目录。只需将 .json 添加到节点的引用 url 的末尾,就可以使用 http.json 文件将其读取为 json 文件。考虑以下示例。 https://database-name.firebaseio.com/profiles/key.json 权限可以是公开的或授权的,并且可以在发出请求之前进行检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2018-10-07
        • 2021-01-21
        • 2017-03-29
        • 1970-01-01
        相关资源
        最近更新 更多