2

JSONをファイルにシリアル化するためにJackson v2.8.2を使用しています。

serializeカスタムシリアライザーを作成し、必要に応じて JSON 出力をカスタマイズするメソッドを実装しました。

次のようにシリアライザーを呼び出しています。

// myClass is the object I want to serialize

SimpleModule module = new SimpleModule();
module.addSerializer(MyClass.class, new MySerializer());

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(module);

try 
{
    mapper.writeValue(new File("json.txt"), myClass);
}

catch (JsonProcessingException e) 
{
    ...
}

JSON ファイルが作成され、コンテンツが適切に表示されます。

ファイルは に従ってフォーマットされていますが、既に実装したDefaultPrettyPrinter独自の custom を使用したいと考えています。PrettyPrinter

それ、どうやったら出来るの?

私は次のことを試しました:

MyPrettyPrinter myPrettyPrinter = new MyPrettyPrinter();
mapper.writer(myPrettyPrinter);
mapper.writeValue(new File("json.txt"), myClass);

しかし、それは私のカスタムプリンターを呼び出していません。

4

2 に答える 2

5

場合によっては、達成したい内容に応じて、次のように を使用してDefaultPrettyPrinterをカスタマイズすることができIndenterます。

DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
Indenter indenter = new CustomSpaceIndenter();
printer.indentObjectsWith(indenter); // Indent JSON objects
printer.indentArraysWith(indenter);  // Indent JSON arrays

関連する質問があります: JsonNodeをJacksonの非常に特定のJSON形式にシリアル化します

于 2016-09-16T09:45:15.800 に答える
3

これは、writer を呼び出すと、ObjectWriter の新しいインスタンスが返されるためです。実際、ObjectMapper には、操作する新しいオブジェクトを構築する多くのファクトリ メソッドがあります。

ObjectMapper からのソースコード:

/**
     * Factory method for constructing {@link ObjectWriter} that will
     * serialize objects using specified pretty printer for indentation
     * (or if null, no pretty printer)
     */
    public ObjectWriter writer(PrettyPrinter pp) {
        if (pp == null) { // need to use a marker to indicate explicit disabling of pp
            pp = ObjectWriter.NULL_PRETTY_PRINTER;
        }
        return _newWriter(getSerializationConfig(), /*root type*/ null, pp);
    }

つまり、コードを次のように変更する必要があります。

MyPrettyPrinter myPrettyPrinter = new MyPrettyPrinter();
ObjectWriter myWriter = mapper.writer(myPrettyPrinter);
myWriter.writeValue(new File("json.txt"), myClass);

呼び出し時に正しいライターを使用するように、myWriter への割り当てに注意してください。writeValue

ObjectMapper とデフォルトのプリティ プリンターを使用した例を次に示します。

public class OMTest {
    public static void main(String[] args) throws IOException {
        // test string
        String json = "  {\"a\" : \"b\", \"c\" : \"d\" } ";
        // mapper
        ObjectMapper mapper = new ObjectMapper();
        // json tree
        JsonNode tree = mapper.readTree(json);
        // the objectWriter assigned with a pretty printer
        ObjectWriter myWriter = mapper.writer(new DefaultPrettyPrinter());
        // print without pretty printer (using mapper)
        System.out.println(mapper.writeValueAsString(tree));
        System.out.println();
        // print with writer (using the pretty printer) 
        System.out.println(myWriter.writeValueAsString(tree));
    }
}

これは以下を出力します:

{"a":"b","c":"d"}

{
  "a" : "b",
  "c" : "d"
}

最初の行ではマッパーを使用し、2 番目の印刷ではライターを使用します。

乾杯、

アルトゥール

于 2016-09-16T09:11:04.000 に答える