“未被承认的领域”杰克逊

时间:2011-08-28 09:46:03

标签: java json deserialization jackson

我正在尝试从此JSON代码中反序列化JSON对象:

{ 
    "bg" : { 
        "fileName" : "data/gui/mainMenuBg.jpg"
    },
    "startGameBtn" : { 
        "text" : "Start Game",
        "innerWidth" : 100,
        "innerHeight" : 50
    }
}

我反序列化的对象看起来像这样:

public class MainMenu extends BasicTWLGameState {
    private StateBasedGame app;

    @JsonProperty private Image bg;
    @JsonProperty private Button startGameBtn;
    // [...]
}

我为Button类的基类创建了一个混合:

public abstract class WidgetMixIn {
    // Not sure why I have to ignore only this when there are other setters that it should complain about...
    @JsonIgnore public abstract boolean setBorderSize(Border border);

    @JsonProperty("innerWidth") public abstract int getInnerWidth();
    @JsonProperty("innerHeight") public abstract int getInnerHeight();

    public abstract void setInnerSize(
            @JsonProperty("innerWidth") int width,
            @JsonProperty("innerHeight") int height);
}

Button类本身的混合:

public class ButtonMixIn {
    @JsonProperty public String text;
}

我得到的错误是:

ERROR:Unrecognized field "innerWidth" (Class de.matthiasmann.twl.Button), not marked as ignorable
    at [Source: data\gui\mainMenu.json; line: 7, column: 27] (through reference chain: state.MainMenu["startGameBtn"]->de.matthiasmann.twl.Button["innerWidth"])

为什么找不到innerWidth混合中定义的Widget属性?

干杯。

2 个答案:

答案 0 :(得分:0)

ButtonMixIn类没有innerHeight和innerWidth JsonProperty注释。

如果ButtonMixIn类是从你定义的抽象按钮类扩展的,那么你就缺少ButtonMixIn extends WidgetMixIn行。

答案 1 :(得分:0)

问题是你的“setInnerSize()” - Java bean属性setter只允许一次设置一个属性;多个属性只能与带注释的构造函数一起使用。 因此,您需要将其拆分为两个独立的设置器。

对于它的价值,有一个功能增强请求让杰克逊使用多参数设置器,但当前版本还不支持。