JsonMappingException:找不到合适的构造函数
JsonMappingException: No suitable constructor found
我正在实施他们的文档中给出的 firebase 示例。我面临这个错误:
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.XYZ.$BlogPost]: can not instantiate from JSON object (need to add/enable type information?)
这是我的代码:
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"
}
}
我不知道我的代码中缺少什么。感谢任何对此进行重新分级的帮助。
在以下行中添加构造函数:
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
class.
您的 JSON 文件无效。
免费在线 JSON 验证器:http://jsonlint.com/
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 本身不支持数组。如果你存储一个数组,它实际上被存储为一个以整数作为键名的“对象”。
我猜你的 BlogPost
class 是你 activity 的 内部 class。在这种情况下,Java 向引用包含对象的每个对象添加一个隐藏字段。而这个隐式字段当然不存在于您的 JSON 数据中。
要解决这个问题,您应该将 BlogPost
class 保存在单独的文件中(这样它就不是内部 class)或将其标记为静态 class(删除隐式字段):
public static class BlogPost {
我正在实施他们的文档中给出的 firebase 示例。我面临这个错误:
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.XYZ.$BlogPost]: can not instantiate from JSON object (need to add/enable type information?)
这是我的代码:
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"
}
}
我不知道我的代码中缺少什么。感谢任何对此进行重新分级的帮助。
在以下行中添加构造函数:
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
class.
您的 JSON 文件无效。 免费在线 JSON 验证器:http://jsonlint.com/
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 本身不支持数组。如果你存储一个数组,它实际上被存储为一个以整数作为键名的“对象”。
我猜你的 BlogPost
class 是你 activity 的 内部 class。在这种情况下,Java 向引用包含对象的每个对象添加一个隐藏字段。而这个隐式字段当然不存在于您的 JSON 数据中。
要解决这个问题,您应该将 BlogPost
class 保存在单独的文件中(这样它就不是内部 class)或将其标记为静态 class(删除隐式字段):
public static class BlogPost {