web-dev-qa-db-ja.com

ジャクソンとオブジェクトを文字列にダンプする

Gsonを使用して、アプリケーションでデバッグ出力を生成しています

Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
gson.toJson(myObject);

しかし、Gsonは、データ構造をシリアル化しようとすると、循環参照エラーについて文句を言います。これはジャクソン図書館でできますか?

[〜#〜] upd [〜#〜] Gson 2.3.1:2014年11月20日リリース

Added support to serialize objects with self-referential fields. The self-referential field is set to null in JSON. Previous version of Gson threw a StackOverflowException on encountering any self-referential fields.
    The most visible impact of this is that Gson can now serialize Throwable (Exception and Error)
28
turbanoff

Jacksonでシリアル化するには:

public String serialize(Object obj, boolean pretty) {
    ObjectMapper mapper = new ObjectMapper();

    mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

    if (pretty) {
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
    }

    return mapper.writeValueAsString(obj);
}
34
Bruno Grieder

ジャクソンは、オブジェクトグラフのサイクルを次の方法で処理できます。

  1. @JsonIgnore 、プロパティを完全に省略する場合
  2. @JsonManagedReference および @JsonBackReference
  3. JsonSerializer を拡張するカスタムシリアライザー

オブジェクトに関する情報を提供したいが、特定のフィールド(サイクルの原因となっているフィールド)を省略したい場合は、JsonSerializerを使用します。例えば:

import org.codehaus.jackson.map.JsonSerializer
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.SerializerProvider;

import Java.io.IOException;

public class ParentReferenceSerializer extends JsonSerializer<Parent> {
    @Override
    public void serialize(Parent parent, JsonGenerator jgen,
        SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        writeNumberField(jgen, "id", parent.getId());
        // ... other fields ...
        jgen.writeEndObject();
    }
}

次に、シリアル化されるクラスで、@JsonSerializeアノテーションを使用します。

@JsonSerialize(using = ParentReferenceSerializer.class)
public Parent getParent() {
    return parent;
}
10
beerbajay