使用jackson解析JSON数组,其中对象是字符串?

时间:2012-06-11 23:59:51

标签: java json jackson

我有一个奇怪的问题。我创建了一个对象,我们称之为Profile,它通过我调用的API成功解析单个JSON对象。还有一个多配置文件接口,它将返回Profile对象的JSON数组。问题是,多配置文件界面将子对象转换为字符串。有没有一种自动方式我可以告诉杰克逊将这些解析为对象?

单个对象的示例: { "foo": "bar" }

多物件的示例: [ "{ \"foo\": \"bar\" }", "{ \"blah\": \"ugh\" }" ]

(抱歉无法使用真实数据)

请注意,子对象实际上是字符串,其中包含转义引号。

为了完整性,我的多对象解析代码如下所示:

ObjectMapper mapper = new ObjectMapper();
Profile[] profile_array = mapper.readValue(response.content, Profile[].class);
for (Profile p: profile_array)
{
    String user = p.did;
    profiles.put(user, p);
}

正如我所说,在单个配置文件的情况下,Profile对象解析。在多配置文件的情况下,我得到了这个例外:

Exception: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.xyz.id.profile.Profile, problem: no suitable creator method found to deserialize from JSON String

3 个答案:

答案 0 :(得分:2)

我想你必须创建一个自定义反序列化器并将其应用于该数组的每个元素。

class MyCustomDeserializer extends JsonDeserializer<Profile> {
    private static ObjectMapper om = new ObjectMapper();

    @Override
    public Profile deserialize(JsonParser jp, DeserializationContext ctxt) {
        // this method is responsible for changing a single text node:
        // "{ \"foo\": \"bar\" }"
        // Into a Profile object

        return om.readValue(jp.getText(), Profile.class);
    }
}

答案 1 :(得分:0)

您是否尝试过使用JAXB?

            final ObjectMapper mapper = new ObjectMapper();

            // Setting up support of JAXB
            final AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

            // make deserializer use JAXB annotations (only)
            mapper.getDeserializationConfig().setAnnotationIntrospector(
                    introspector);

            // make serializer use JAXB annotations (only)
            mapper.getSerializationConfig().setAnnotationIntrospector(
                    introspector);

            final StringReader stringReader = new StringReader(response);
            respGetClasses = mapper.readValue(stringReader,
                    FooBarClass.class);

以上内容应该让你开始......

此外,您需要像这样标记每个子类:

@XmlElement(name = "event")
public List<Event> getEvents()
{
    return this.events;
}

答案 2 :(得分:0)

对于嵌入式JSON-in-JSON内容的“重新解析”没有开箱即用的支持。 但这听起来像是一个可能的增强请求(RFE)......