【问题标题】:JsonMappingException: No suitable constructor foundJsonMappingException:找不到合适的构造函数
【发布时间】:2016-03-24 03:30:58
【问题描述】:

我正在实施他们文档中给出的 firebase 示例。我正面临这个错误:

com.fasterxml.jackson.databind.JsonMappingException: 没有找到适合类型 [simple type, class com.XYZ.$BlogPost] 的构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)

这是我的代码:

    public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);
        Firebase.setAndroidContext(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        // Get a reference to our posts
        Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts");
        // Attach an listener to read the data at our posts reference
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                System.out.println("There are " + snapshot.getChildrenCount() + " blog posts");
                for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                    BlogPost post = postSnapshot.getValue(BlogPost.class);
                    System.out.println(post.getAuthor() + " - " + post.getTitle());
                }
            }
            @Override
            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
            }
        });
    }
public class BlogPost {
        private String author;
        private String title;
        public BlogPost() {
            // empty default constructor, necessary for Firebase to be able to deserialize blog posts
        }
        public String getAuthor() {
            return author;
        }
        public String getTitle() {
            return title;
        }
    }
}

关于包含反序列化 JSON 所必需的空构造函数的同一件事,我已经经历了许多问题。我已将其包括在内,但我仍然无法解决问题。这是我试图反序列化的 JSON:

{  
   "-JRHTHaIs-jNPLXOQivY":{  
      "author":"gracehop",
      "title":"Announcing COBOL, a New Programming Language"
   },
   "-JRHTHaKuITFIhnj02kE":{  
      "author":"alanisawesome",
      "title":"The Turing Machine"
   }
}

我不知道我的代码中缺少什么。感谢您提供任何重新评分的帮助。

【问题讨论】:

  • "-JRHTHaIs-jNPLXOQivY" 值没有键,并且列表没有用逗号分隔,json 对象已损坏

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


【解决方案1】:

在以下行中添加一个构造函数:

public BlogPost(String author,String title) {
    this.author=author;
    this.title=title;
}

但是,您也可能需要将BlogPost 重新定义为:

class BLogPost {
  public BlogPost() { }
  String postId;
  List<SomeObject> someObject;
  Getters/setters
}

其中SomeObject 是您当前的BLogPost 类。

【讨论】:

    【解决方案2】:

    您的 JSON 文件无效。 免费的在线 JSON 验证器:http://jsonlint.com/

    【讨论】:

    【解决方案3】:

    Firebase 使用 -JRHTHaIs-jNPLXOQivY 作为对象的键

    {
     author: "gracehop"
     title: "Announcing COBOL, a New Programming Language"
    }
    

    您必须使用它作为访问对象的密钥。您必须向 api 发送正确的请求。在这种情况下,它将是

    https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY

    如果你想从 Firebase 接收一个数组,你必须像这样存储它。

    posts{
         "1":{
              author: "gracehop"
              title: "Announcing COBOL, a New Programming Language"
            },
         "2":{
             author: "alanisawesome"
             title: "The Turing Machine"
            }
    }
    

    Firebase 没有对数组的原生支持。如果你存储一个数组,它实际上会被存储为一个以整数作为键名的“对象”。

    Check out this Firebase blog post for more information

    【讨论】:

      【解决方案4】:

      我猜你的BlogPost 类是你活动的内部类。在这种情况下,Java 会为每个引用包含对象的对象添加一个隐藏字段。而这个隐式字段当然不会出现在您的 JSON 数据中。

      要解决这个问题,您应该将 BlogPost 类保存在单独的文件中(这样它就不是内部类)或将其标记为静态类(这会删除隐式字段):

      public static class BlogPost {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-24
        • 2022-01-11
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多