请考虑以下示例:
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",
}
3条答案
按热度按时间i7uaboj41#
只是不要在调用
writeBinary
之后再调用writeEndObject()
。它应该看起来像这样:xdyibdwo2#
JsonSerializer
类型有一个unwrappingSerializer
方法,该方法“解包”序列化程序。对于BeanSerialier
(用于写入对象的序列化程序),返回的序列化程序将不写入对象的开始和结束。所提供的示例(经过重写以使用此示例)如下所示:
获取
SerializerProvider
取决于实际实现,因为提供的示例不使用ObjectCodec
。最佳情况下,此代码将位于自定义序列化程序的serialize
方法中,其中SerializerProvider
作为参数给出。传递给
unwrappingSerializer
的NameTransformer
可以用来轻松地Map名称,例如,通过给它们加前缀。使用NameTransformer.NOP
只是按照原始序列化程序写入的方式写入名称。3zwtqj6y3#
你基本上想把
object
变量合并到generator
的目标对象中。如果你能访问object
变量并且知道它的属性,那么你就可以简单地用generator
的方法来写它们,例如:有些属性可能是复杂对象(aka POJO),您必须使用
writePOJOField(String fieldName, Object pojo)
;要使writePOJOField
正常工作,您必须正确示例化您的JsonFactory
,例如new JsonFactory(new ObjectMapper())
。另请参阅https://stackoverflow.com/a/73702885/4681265。另一种更通用的方法是生成
object
JSON,然后使用以下语句将其写入generator
的输出:通过跳过
object
JSON的左括号和右括号。