2013-01-24 107 views
3

我使用Jackson反序列化以下JSON成POJO:无法反序列化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:在[来源无法反序列化mypackage.F的情况下进行START_ARRAY令牌 的:[email protected]; ] 227行:1,列(通过参考链:mypackage.Response [ “行”] - > mypackage.FWrapper [ “F”])

我检查用类似的错误几个老问题,但couldn”还没有解决我的问题。 This 看起来和我的非常相似,正确的回答是Your data is problematic in that you have inner wrapper objects in your array,我认为我的数据也是如此。但是我仍然无法做正确的POJO映射。任何指针将不胜感激。

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

+0

一个建议:尽量填充一个'Response'实例,让杰克逊序列化。看看这与你得到的JSON输入在结构上有什么不同。这应该解释具体问题。 – StaxMan

回答

0

你的“行”阵列不具有右方括号]

它使JSON无效。

仔细阅读错误消息:

org.codehaus.jackson.map.JsonMappingException:在[来源无法反序列化mypackage.F 的情况下进行START_ARRAY令牌的:[email protected];行:1,柱:227](通过参考链:mypackage.Response [“行”] - > mypackage.FWrapper [ “F”])


现在我看到修改过的JSON - 添加它。

你还有同样的问题吗?

+0

感谢您注意,但这只是我发布的问题中的一个错字。我使用的原始'Json'是有效的,所以这不是问题。 – Swapnil

+0

@Swapnil你尝试重新运行它吗?同样的问题? –

+0

正如我所说,错字只是在我在这里发布的问题。原始的Json已经有了这个方括号。所以是的,问题仍然存在。 – Swapnil

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; 
} 
+0

我认为你是对的。包装很奇怪 - 它们不匹配JSON对象结构。 +1。 –

+0

你说'f'不是'JSON'中的对象是对的!我删除了F,保留了原来的FWrapper和VWrapper。 'class FWrapper {public List f; ''工作。 – Swapnil