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

Java 使用jackson解析JSON数组,其中对象是字符串?,java,json,jackson,Java,Json,Jackson,我有一个稍微奇怪的问题。我创建了一个对象,我们称之为概要文件,它通过我调用的API成功解析单个JSON对象。还有一个多配置文件接口,它将返回配置文件对象的JSON数组。问题是,多轮廓接口将子对象转换为字符串。有没有一种自动的方法可以让jackson把这些解析成对象 单个对象的示例: {“foo”:“bar} 多对象的示例: (抱歉,无法使用真实数据) 请注意,子对象实际上是字符串,其中包含转义引号 为完整起见,我的多对象分析代码如下所示: ObjectMapper mapper = new O

我有一个稍微奇怪的问题。我创建了一个对象,我们称之为概要文件,它通过我调用的API成功解析单个JSON对象。还有一个多配置文件接口,它将返回配置文件对象的JSON数组。问题是,多轮廓接口将子对象转换为字符串。有没有一种自动的方法可以让jackson把这些解析成对象

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

多对象的示例:

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

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

为完整起见,我的多对象分析代码如下所示:

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);
}
正如我所说,在单概要文件的情况下,概要文件对象解析。在multi-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

你试过使用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;
}
@xmlement(name=“event”)
公共列表getEvents()
{
返回此项。事件;
}

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

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);
    }
}
类MyCustomDeserializer扩展JsonDeserializer{ 私有静态ObjectMapper om=新ObjectMapper(); @凌驾 公共配置文件反序列化(JsonParser jp,反序列化上下文ctxt){ //此方法负责更改单个文本节点: //“{\'foo\':\'bar\'}” //插入到纵断面对象中 返回om.readValue(jp.getText(),Profile.class); } }
对于JSON内容中嵌入的JSON的“重新解析”,没有现成的支持。
但这听起来像是一个可能的增强请求(RFE).

配置文件是一个类还是一个接口?为什么不在上面实现fromValue(String)并将解析逻辑放在其中呢?Profile是一个类,它是JSON概要文件对象数据的容器。我想这就是答案。我将尝试一下,谢谢。虽然可以通过这种方式使用JAXB注释,但这对解决实际问题有何帮助?@StaxMan他的问题是,他想强制将JSON解析为复杂对象,他遇到了一些问题。我只是提出了我的解决方案(使用JAXB),因为我在使用Jackson库时用它解决了类似他的问题……事实上,我并不认为他的问题是:如果你仔细看看他展示的JSON示例,多对象情况下,更大的问题是内容是字符串,而不是JSON。但即使是JSON,数组和对象之间也会有结构上的差异。这就是我问的原因:您正在演示如何指定属性名,这可能很有用,但提交者似乎并没有遇到什么困难。所以我想也许我错过了什么…@StaxMan-啊,我的错。虽然他在问如何防止它们变成字符串,但我的解决方案会有帮助。基本上,他有普通的JSON,一旦他通过他的“多配置文件接口”传递JSON,它们将作为字符串而不是对象返回。我处理这个问题的目的是修复他的“多配置文件接口”,而不是将字符串解析为对象。但也许我没有正确理解OP,它以前发生过,以后还会发生!:)