如何通过JacksonJsonGenerator内联对象?

bxpogfeg  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(113)

请考虑以下示例:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

import java.io.File;
import java.io.FileInputStream;

public class Exmaple {
    public static void main (String[] args) throws Exception {

        Object object = new Object() {
            private String id = "someId";
        };

        final JsonGenerator generator = new JsonFactory().createGenerator(System.out);
        generator.writeStartObject();
        generator.writeFieldName("data");
        generator.writeBinary(new FileInputStream(new File("D:\\!Temp\\elasticsearch\\pdf.pdf")), -1);
        generator.writeEndObject();
        generator.writeObject(object);
        generator.close();
    }
}

目标是在json流期间添加object中的所有字段。

{
  "data": "JVBERi0xLjMKJ="
} {
  "id": "someId",
}

如何告诉jackson不要从对象写入{}

已更新

预期结果为(例如data + java对象中的所有键):

{
  "data": "JVBERi0xLjMKJ=",
  "id": "someId",
}
i7uaboj4

i7uaboj41#

只是不要在调用writeBinary之后再调用writeEndObject()。它应该看起来像这样:

final JsonGenerator generator = new JsonFactory().createGenerator(System.out);
        generator.writeStartObject();
        generator.writeFieldName("data");
        generator.writeBinary(new FileInputStream(new File("D:\\!Temp\\elasticsearch\\pdf.pdf")), -1);
        generator.writeObject(object);
        generator.writeEndObject();
        generator.close();
xdyibdwo

xdyibdwo2#

JsonSerializer类型有一个unwrappingSerializer方法,该方法“解包”序列化程序。对于BeanSerialier(用于写入对象的序列化程序),返回的序列化程序将不写入对象的开始和结束。
所提供的示例(经过重写以使用此示例)如下所示:

final SerializerProvider serializerProvider = /* obtain serializer provider */;
final JsonSerializer<Object> objectSerializer = serializerProvider.findValueSerializer(object.getClass());
final JsonSerializer<Object> unwrappingSerializer = objectSerializer.unwrappingSerializer(NameTransformer.NOP);

final JsonGenerator generator = new JsonFactory().createGenerator(System.out);
generator.writeStartObject();
generator.writeFieldName("data");
generator.writeBinary(new FileInputStream(new File("D:\\!Temp\\elasticsearch\\pdf.pdf")), -1);
unwrappingSerializer.serialize(object, generator, serializerProvider);
generator.close();

获取SerializerProvider取决于实际实现,因为提供的示例不使用ObjectCodec。最佳情况下,此代码将位于自定义序列化程序的serialize方法中,其中SerializerProvider作为参数给出。
传递给unwrappingSerializerNameTransformer可以用来轻松地Map名称,例如,通过给它们加前缀。使用NameTransformer.NOP只是按照原始序列化程序写入的方式写入名称。

3zwtqj6y

3zwtqj6y3#

你基本上想把object变量合并到generator的目标对象中。如果你能访问object变量并且知道它的属性,那么你就可以简单地用generator的方法来写它们,例如:

generator.writeStringField("id", object.id)

有些属性可能是复杂对象(aka POJO),您必须使用writePOJOField(String fieldName, Object pojo);要使writePOJOField正常工作,您必须正确示例化您的JsonFactory,例如new JsonFactory(new ObjectMapper())。另请参阅https://stackoverflow.com/a/73702885/4681265
另一种更通用的方法是生成object JSON,然后使用以下语句将其写入generator的输出:

// see http://fasterxml.github.io/jackson-core/javadoc/2.13/
generator.writeRaw(char[] text, int offset, int len)

通过跳过object JSON的左括号和右括号。

相关问题