0

逆シリアル化しようとしている次の JSON ファイルがあります。

{
    "name": "ComponentX",
    "implements": ["Temperature.Sensor"],
    "requires": [
        {"type": "interface", "name": "Temperature.Thermostat", "execute": [
            "../Thermostat.exe"
        ]}
    ]
}

これは、分散システムのコード サンプルのコンポーネントの説明です。

これが逆シリアル化されることになっているクラスは次のとおりです。

public class ComponentDescription {
    @JsonProperty("name")
    public String Name;

    @JsonProperty("implements")
    public String[] Implements;

    @JsonProperty("requires")
    public ComponentDependency[] Requires;

    @JsonIgnore
    public String RabbitConnectionName;

    private static final ObjectMapper mapper = new ObjectMapper();

    public static ComponentDescription FromJSON(String json)
        throws JsonParseException, JsonMappingException, IOException
    {
        return mapper.readValue(json, ComponentDescription.class);
    }

    public class ComponentDependency
    {
        @JsonCreator
        public ComponentDependency() {
            // Need an explicit default constructor in order to use Jackson.
        }

        @JsonProperty("type")
        public DependencyType Type;

        @JsonProperty("name")
        public String Name;

        /**
         * A list of ways to start the required component if it is not already running.
         */
        @JsonProperty("execute")
        public String[] Execute;
    }

    /**
     * A dependency can either be on "some implementation of an interface" or it
     * can be "a specific component", regardless of what other interface implementations
     * may be available.
     */
    public enum DependencyType
    {
        Interface,
        Component
    }
}

Jackson ObjectMapper を使用して JSON を適切なクラスに逆シリアル化する を実行するComponentDescription.FromJSON(jsonData)と、次の例外が発生します。

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "type" (class edu.umd.cs.seam.dispatch.ComponentDescription), not marked as ignorable (3 known properties: , "implements", "name", "requires"])
 at [Source: java.io.StringReader@39346e64; line: 1, column: 103] (through reference chain: edu.umd.cs.seam.dispatch.ComponentDescription["requires"]->edu.umd.cs.seam.dispatch.ComponentDescription["type"])

Jackson はrequiresJSON オブジェクトの配列を の配列ではComponentDescriptionなく の配列として逆シリアル化しようとしているようですComponentDependency正しいクラスを使用するにはどうすればよいですか? タイプ名を別の場所(属性public ComponentDependency[] Requiresなど)に再度入力する必要がある回答よりも、Jacksonにタイプを見て自動的に使用させる回答を好むでしょう。@

4

1 に答える 1

3

私の推測では、問題は ではComponentDependencyないことにあると思いstaticます。宣言されていないためstatic、 の既存のインスタンスでのみインスタンス化できることを意味しますComponentDescription

詳しくは こちら をご覧ください

于 2013-06-23T18:29:47.857 に答える