JsonMappingException: подходящий конструктор не найден

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

com.fasterxml.jackson.databind.JsonMappingException: не найден подходящий конструктор для типа [простой тип, класс 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"
   }
}

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


person brainbreaker    schedule 17.12.2015    source источник
comment
-JRHTHaIs-jNPLXOQivY значение не имеет ключа, и список не разделен запятой, объект json поврежден   -  person hugerde    schedule 17.12.2015


Ответы (4)


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

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

public static class BlogPost {
person Frank van Puffelen    schedule 17.12.2015

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

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

person Norbert van Nobelen    schedule 17.12.2015

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

person uncleBounty    schedule 17.12.2015
comment
Вы можете посмотреть JSON по ссылке: docs-examples.firebaseio .com/web/saving-data/fireblog/posts - person brainbreaker; 17.12.2015

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 не имеет встроенной поддержки массивов. Если вы храните массив, он действительно сохраняется как «объект» с целыми числами в качестве имен ключей.

Дополнительную информацию можно найти в этом сообщении блога Firebase.

person Prashant Solanki    schedule 17.12.2015