【问题标题】:"No suitable constructor for simple type" with Jackson in Android and objects inside another“没有适合简单类型的构造函数”,Android 中的 Jackson 和另一个对象中的对象
【发布时间】:2015-09-23 14:44:10
【问题描述】:

我在我的项目中使用 Jackson 来解析从服务器接收到的 JSON,解析步骤效果很好,当尝试使用嵌套对象时出现问题。这是一些代码:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Song {

    @JsonProperty("id")
    private int id = 0;
    @JsonProperty("title")
    private String title = "";
    @JsonProperty("link")
    private String link = "";
    @JsonProperty("album")
    private Album album;

    public Song() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getLink() {
       return link ;
    }

    public void setLink(String link ) {
        this.link = link ;
    }

    public Album getAlbum() {
        return album;
    }

    public void setAlbum(Album album) {
        this.album = album;
    }
}

专辑类如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Album {

    @JsonProperty("id")
    private int id;
    @JsonProperty("title")
    private String title;
    @JsonProperty("artist")
    private Artist artist;

    public Album(){}

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title){
        this.title = title;
    }

    public Artist getArtist() {
        return artist;
    }

    public void setArtist(Artist artist) {
        this.artist = artist;
    }
}

最后是“艺术家”类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Artist{

    @JsonProperty("id")
    private int id;
    @JsonProperty("name")
    private String name;

    public Artist() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

所以,正如我在 JSON 解析工作良好之前所说的那样,问题是当我尝试访问“子”对象之一时,例如,如果我尝试获取艺术家姓名。当我这样做时:

getSong().getAlbum().getArtist().getName();

不管我在哪里做,Jackson 停止解析 JSON 给:

(IOException)Error: No suitable constructor found for type [simple type, class com.zarpamos.fandanztap.model.Album]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)

纯 JSON 输出:

{"categories":[{"id":"1","name":"Pop","packs":[{"id":"2","songs":[{"album":{"id":"2","title":"Sex And Love","artist":{"id":"2","name":"Enrique Iglesias"}},"id":"3","title":"Bailando","link":"song_1.mp3"},{"album":{"id":"1","title":"Peace Is The Mission","artist":{"id":"3","name":"Major Lazer"}},"id":"6","title":"Powerful","link":"song_2.mp3"},{"album":{"id":"2","title":"Sex And Love","artist":{"id":"2","name":"Enrique Iglesias"}},"id":"4","title":"Loco","link":"song_3.mp3"}, // More JSON elements...

解析“类别”和“包”效果很好,问题出在“专辑”内。

相同的 JSON 输出但风格化:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => Pop
                    [packs] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [songs] => Array                // Here starts the songs JSON array, where the error is produced
                                        (
                                            [0] => Array                // song
                                                (
                                                    [album] => Array            // album
                                                        (
                                                            [id] => 2
                                                            [title] => Sex And Love
                                                            [artist] => Array           // artist
                                                                (
                                                                    [id] => 2
                                                                    [name] => Enrique Iglesias
                                                                )

                                                        )

                                                    [id] => 3
                                                    [title] => Bailando
                                                    [link] => song_1.mp3
                                                )

                                            [1] => Array
                                                (
                                                    [album] => Array
                                                        (
                                                            [id] => 1
                                                            [title] => Peace Is The Mission
                                                            [artist] => Array
                                                                (
                                                                    [id] => 3
                                                                    [name] => Major Lazer
                                                                )

                                                        )

                                                    [id] => 6
                                                    [title] => Powerful
                                                    [link] => song_2.mp3
                                                )

                                            [2] => Array
                                                (
                                                    [album] => Array
                                                        (
                                                            [id] => 2
                                                            [title] => Sex And Love
                                                            [artist] => Array
                                                                (
                                                                    [id] => 2
                                                                    [name] => Enrique Iglesias
                                                                )

                                                        )

                                                    [id] => 4
                                                    [title] => Loco
                                                    [link] => song_3.mp3
                                                )
                // More array elements...

这是堆栈跟踪:

 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1080)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:142)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
 W/System.err﹕ at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
 W/System.err﹕ at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3562)
 W/System.err﹕ at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2578)
 W/System.err﹕ at com.dolphinziyo.myapp.tasks.GetPacksTask.onPostExecute(GetPacksTask.java:93)
 W/System.err﹕ at com.dolphinziyo.myapp.tasks.GetPacksTask.onPostExecute(GetPacksTask.java:38)
 W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:631)
 W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177)
 W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
 W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:107)
 W/System.err﹕ at android.os.Looper.loop(Looper.java:194)
 W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5371)
 W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
 W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
 W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
 W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
 W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)

这真的很奇怪,我不知道我做错了什么。谁能告诉我错误在哪里?

提前谢谢你

【问题讨论】:

  • 那不是 JSON 输出,看起来更像一个 PHP 对象? 访问对象时遇到错误很奇怪,您可以发布堆栈跟踪吗?
  • 那是打印的 JSON 输出(来自 PHP)为了更具可读性,我决定显示这个而不是普通的 JSON。我去看看能不能打印一个stacktrace
  • 我用相同的 JSON 代码更新了我的帖子,但现在是纯文本。
  • 我刚刚添加了堆栈跟踪

标签: android json parsing constructor jackson


【解决方案1】:

在您的 Album 类中,您必须有一个用于 Artist 属性的设置器,如下所示:

 public void setArtist(Artist artist) {
    this.artist = artist;
 }

不是这样的:

 public void setArtist(**Artista** artist) {
    this.artist = artist;
 }

【讨论】:

  • 将我的代码翻译成 StackOverflow 时出现拼写错误,我用西班牙语编写了代码。我已经修复了我的帖子,谢谢你
【解决方案2】:

我终于手动解析它,直到我有更多的时间来测试它。

【讨论】:

    【解决方案3】:

    您的类是顶级类型还是嵌套在另一个类中?如果它们是嵌套的,则需要将它们标记为“静态”

    【讨论】:

    • 它们是嵌套的,正如我在代码中显示的那样,“艺术家”嵌套在“专辑”中,“专辑”在“歌曲”中,我将尝试将它们静态化,谢谢。
    • 抱歉,它们是顶级的(如提供的代码中所示),没有嵌套。无论如何,我尝试将它们静态化,但应用程序因空指针异常而失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2011-11-29
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多