无法将JSON反序列化为POJO(使用Jackson)

4

我正在使用Jackson将以下的JSON反序列化为一个POJO:

{
    "etag": "\"SomeETag\"",
    "jobComplete": true,
    "jobReference": {
        "jobId": "someJobId",
        "projectId": "someProjectId"
    },
    "rows": [
        {
            "f": [
                {
                    "v": "101"
                },
                {
                    "v": "FirstService"
                },
                {
                    "v": "firstAPI"
                }
            ]
        },
        {
            "f": [
                {
                    "v": "102"
                },
                {
                    "v": "SecondService"
                },
                {
                    "v": "SecondAPI"
                }
            ]
        }
    ],
    "totalRows": "2"
}

这是我正在使用的POJO:

    @JsonAutoDetect
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Response {

        public String etag;
        public boolean jobComplete;
        public List<FWrapper> rows = new ArrayList<FWrapper>();
    }

    class FWrapper {
        public F f; 
    }

    class F {
        public List<VWrapper> vWrappers = new ArrayList<VWrapper>();       
    }

    class VWrapper {
        public String v;
    }

我正在使用这段代码来进行映射:
    ObjectMapper mapper = new ObjectMapper();
    Response response = mapper.readValue(response, Response.class);

以下是我遇到的错误:

org.codehaus.jackson.map.JsonMappingException: 无法将START_ARRAY令牌反序列化为mypackage.F的实例 at [Source: java.io.StringReader@11563ff; line: 1, column: 227] (through reference chain: mypackage.Response["rows"]->mypackage.FWrapper["f"])

我查看了几个类似错误的旧问题,但仍然无法解决我的问题。这个 看起来与我的情况非常相似,因为正确的响应说道: 你的数据存在问题,因为你在数组中有内部包装对象,我认为我的数据也是这种情况。但我仍然没有能够进行正确的POJO映射。任何提示将不胜感激。

编辑:更正了一个打字错误(我使用的Json是有效的)


一个建议:尝试填充一个Response实例,让Jackson序列化它。看看它在结构上与您获得的JSON输入有何不同。这应该可以解释具体的问题。 - StaxMan
2个回答

5

您的类模型与您的JSON不匹配。

在您的JSON中,f是一个数组而不是对象。 在您的类F中,它是一个包含一堆东西列表的对象。

像这样的映射应该可以工作(未经测试)

public class Response {

    public String etag;
    public boolean jobComplete;
    public List<F> rows;
}


public class F {
    public List<V> f;
}

public Class V {
    public String v;
}

我认为你是正确的。包装器很奇怪 - 它们与JSON对象结构不匹配。+1。 - Alex Kreutznaer
你的观点是正确的,JSON中的f不是一个对象!我删除了F,将FWrapper和VWrapper保留在原来的状态。 class FWrapper { public List<VWrapper> f; } 工作正常。 - Swapnil

0

你的“rows”数组没有闭合方括号]

这使得JSON无效。

仔细阅读错误信息:

org.codehaus.jackson.map.JsonMappingException: 无法将mypackage.F实例反序列化为START_ARRAY令牌之外的内容,位于[Source: java.io.StringReader@11563ff; line: 1, column: 227](通过引用链:mypackage.Response ["rows"] -> mypackage.FWrapper [“f”])


现在我看到你修改了JSON - 添加了它。

你还有同样的问题吗?


谢谢您注意到这一点,但那只是我发布的问题中的一个打字错误。我使用的原始Json是有效的,所以这不是问题所在。 - Swapnil
@Swapnil 你尝试重新运行了吗?还是同样的问题? - Alex Kreutznaer
就像我所说的,拼写错误只出现在我在这里发布的问题中。原始的Json已经有那个方括号了。所以是的,问题仍然存在。 - Swapnil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接