使用Jackson JsonNodeFactory的最佳方式

我正在使用Jackson构建自定义JSON对象。 这是正确的方法吗?

它似乎工作得很好(输出是正确的)但我可能会错过我使用JsonNodeFactory的方式。 对象是否意味着像我在这里所做的那样传递?

JsonNodeFactory factory = JsonNodeFactory.instance; ObjectNode dataTable = new ObjectNode(factory); ArrayNode aaData = new ArrayNode(factory); for (PkgLoad pkgLoad : pkgLoadList) { ObjectNode row = new ObjectNode(factory); row.put("ounces", pkgLoad.ounces); row.put("revolutions", pkgLoad.revolutions); aaData.add(row); } dataTable.put("aaData", aaData); 

这是有效的,尽管意图是它是创建实例的工厂。 但最常见的是,您只需使用ObjectMapper访问所有内容,例如:

 ObjectMapper mapper = new ObjectMapper(); ObjectNode dataTable = mapper.createObjectNode(); ArrayNode aa = dataTable.putArray("aaData"); 

单独的JsonNodeFactory的主要原因是允许您创建自定义节点类型(通常是标准实例的子类); 然后配置ObjectMapper以使用不同的工厂。 为方便起见,ArrayNode和ObjectNode确实引用了一个工厂实例,它与“putArray”和其他需要创建新节点的方法一起使用。

只是一个建议,直接处理简单的数据类型并将它们序列化为JSON并使用Jackson ObjectMapper返回更容易,而不是处理原始的Jackson Treemodel

因此,在您的示例中,您可以创建以下类型的结构:

 class AaData{ private List rowList = new ArrayList(); .. class ARow{ String ounces; String revolutions; .. 

然后以下将为您生成适当的json:

 StringWriter sw = new StringWriter(); JsonFactory jf = new JsonFactory(); ObjectMapper m = new ObjectMapper(); m.writeValue(sw, aaData); System.out.println(sw.toString()); 

如果您在代码中构建了很多JsonNode ,那么您可能会对以下一组实用程序感兴趣。 使用它们的好处是它们支持更自然的链接样式,更好地显示构造下的JSON结构。

以下是一个示例用法:

 import static JsonNodeBuilders.array; import static JsonNodeBuilders.object; ... val request = object("x", "1").with("y", array(object("z", "2"))).end(); 

这相当于以下JSON:

 {"x":"1", "y": [{"z": "2"}]} 

这是课程:

 import static lombok.AccessLevel.PRIVATE; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.val; /** * Convenience {@link JsonNode} builder. */ @NoArgsConstructor(access = PRIVATE) public final class JsonNodeBuilders { /** * Factory methods for an {@link ObjectNode} builder. */ public static ObjectNodeBuilder object() { return object(JsonNodeFactory.instance); } public static ObjectNodeBuilder object(@NonNull String k1, boolean v1) { return object().with(k1, v1); } public static ObjectNodeBuilder object(@NonNull String k1, int v1) { return object().with(k1, v1); } public static ObjectNodeBuilder object(@NonNull String k1, float v1) { return object().with(k1, v1); } public static ObjectNodeBuilder object(@NonNull String k1, String v1) { return object().with(k1, v1); } public static ObjectNodeBuilder object(@NonNull String k1, String v1, @NonNull String k2, String v2) { return object(k1, v1).with(k2, v2); } public static ObjectNodeBuilder object(@NonNull String k1, String v1, @NonNull String k2, String v2, @NonNull String k3, String v3) { return object(k1, v1, k2, v2).with(k3, v3); } public static ObjectNodeBuilder object(@NonNull String k1, JsonNodeBuilder builder) { return object().with(k1, builder); } public static ObjectNodeBuilder object(JsonNodeFactory factory) { return new ObjectNodeBuilder(factory); } /** * Factory methods for an {@link ArrayNode} builder. */ public static ArrayNodeBuilder array() { return array(JsonNodeFactory.instance); } public static ArrayNodeBuilder array(@NonNull boolean... values) { return array().with(values); } public static ArrayNodeBuilder array(@NonNull int... values) { return array().with(values); } public static ArrayNodeBuilder array(@NonNull String... values) { return array().with(values); } public static ArrayNodeBuilder array(@NonNull JsonNodeBuilder... builders) { return array().with(builders); } public static ArrayNodeBuilder array(JsonNodeFactory factory) { return new ArrayNodeBuilder(factory); } public interface JsonNodeBuilder { /** * Construct and return the {@link JsonNode} instance. */ T end(); } @RequiredArgsConstructor private static abstract class AbstractNodeBuilder implements JsonNodeBuilder { /** * The source of values. */ @NonNull protected final JsonNodeFactory factory; /** * The value under construction. */ @NonNull protected final T node; /** * Returns a valid JSON string, so long as {@code POJONode}s not used. */ @Override public String toString() { return node.toString(); } } public final static class ObjectNodeBuilder extends AbstractNodeBuilder { private ObjectNodeBuilder(JsonNodeFactory factory) { super(factory, factory.objectNode()); } public ObjectNodeBuilder withNull(@NonNull String field) { return with(field, factory.nullNode()); } public ObjectNodeBuilder with(@NonNull String field, int value) { return with(field, factory.numberNode(value)); } public ObjectNodeBuilder with(@NonNull String field, float value) { return with(field, factory.numberNode(value)); } public ObjectNodeBuilder with(@NonNull String field, boolean value) { return with(field, factory.booleanNode(value)); } public ObjectNodeBuilder with(@NonNull String field, String value) { return with(field, factory.textNode(value)); } public ObjectNodeBuilder with(@NonNull String field, JsonNode value) { node.set(field, value); return this; } public ObjectNodeBuilder with(@NonNull String field, @NonNull JsonNodeBuilder builder) { return with(field, builder.end()); } public ObjectNodeBuilder withPOJO(@NonNull String field, @NonNull Object pojo) { return with(field, factory.pojoNode(pojo)); } @Override public ObjectNode end() { return node; } } public final static class ArrayNodeBuilder extends AbstractNodeBuilder { private ArrayNodeBuilder(JsonNodeFactory factory) { super(factory, factory.arrayNode()); } public ArrayNodeBuilder with(boolean value) { node.add(value); return this; } public ArrayNodeBuilder with(@NonNull boolean... values) { for (val value : values) with(value); return this; } public ArrayNodeBuilder with(int value) { node.add(value); return this; } public ArrayNodeBuilder with(@NonNull int... values) { for (val value : values) with(value); return this; } public ArrayNodeBuilder with(float value) { node.add(value); return this; } public ArrayNodeBuilder with(String value) { node.add(value); return this; } public ArrayNodeBuilder with(@NonNull String... values) { for (val value : values) with(value); return this; } public ArrayNodeBuilder with(@NonNull Iterable values) { for (val value : values) with(value); return this; } public ArrayNodeBuilder with(JsonNode value) { node.add(value); return this; } public ArrayNodeBuilder with(@NonNull JsonNode... values) { for (val value : values) with(value); return this; } public ArrayNodeBuilder with(JsonNodeBuilder value) { return with(value.end()); } public ArrayNodeBuilder with(@NonNull JsonNodeBuilder... builders) { for (val builder : builders) with(builder); return this; } @Override public ArrayNode end() { return node; } } } 

请注意,该实现使用Lombok ,但您可以轻松地去掉它以填充Java样板。

 ObjectNode factory = JsonNodeFactory.instance.objectNode(); 

这很好用。 我认为这是一种更简单的方法。