2015-12-17 3 views
3

Я использую пример firebase, как указано в их документах. Я перед этой ошибкой:JsonMappingException: не найдено подходящего конструктора

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" 
    } 
} 

Я не знаю, что мне не хватает в моем коде. Любая помощь, регрессирующая, оценивается.

+0

это is not json – njzk2

+0

Значение «-JRHTHaIs-jNPLXOQivY» не имеет ключа, а список не разделяется запятой, объект json поврежден – hugerde

ответ

8

Я предполагаю, что ваш BlogPost класса является внутренним классом вашей деятельности. В этом случае Java добавляет скрытое поле к каждому объекту, который ссылается на содержащий объект. И это неявное поле, конечно же, отсутствует в ваших данных JSON.

Чтобы решить эту проблему, вы должны либо держать BlogPost класс в отдельном файле (так что это не внутренний класс) или пометить его как статический класс (который удаляет неявный поле):

public static class BlogPost { 
0

Добавьте конструктор в строке:

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 класс.

0

Ваш JSON-файл недействителен. бесплатный онлайн валидатор JSON: http://jsonlint.com/

+0

Вы можете посмотреть JSON по ссылке: https: //docs-examples.firebaseio. ком/веб/сберегательные данные/fireblog/сообщения – brainbreaker

0

Firebase использует -JRHTHaIs-jNPLXOQivY как ключ к объекту

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

Вы должны использовать это в качестве ключа для Acces объекта. Вам нужно будет отправить правильный запрос в 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