2

少し変わった質問があります。オブジェクトを作成しました。プロファイルと呼びましょう。これは、呼び出した API を介して単一の JSON オブジェクトを正常に解析します。また、プロファイル オブジェクトの 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
4

3 に答える 3

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);
    }
}
于 2012-06-12T00:09:34.723 に答える
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;
}
于 2012-06-12T00:07:35.500 に答える
0

埋め込まれた JSON-in-JSON コンテンツの「再解析」に対するすぐに使えるサポートはありません。しかし、これは機能強化要求 (RFE) の可能性があるように思えます...

于 2012-06-12T18:13:22.580 に答える