从对象

时间:2015-12-09 13:54:03

标签: java json jackson

我需要在给定键和值的情况下向现有ObjectNode添加新项目。该值在方法sig中指定为Object是ObjectNode.set()接受的类型之一(StringInteger,{ {1}}等)。但我不能只做Boolean,因为值只是myObjectNode.set(key, value);,当然我得到“不适用于参数(String,Object)”错误。

我的make-it-work解决方案是创建一个功能来检查Object并将其投射以创建instanceof

ValueNode

..然后我可以使用private static ValueNode getValueNode(Object obj) { if (obj instanceof Integer) { return mapper.createObjectNode().numberNode((Integer)obj); } if (obj instanceof Boolean) { return mapper.createObjectNode().booleanNode((Boolean)obj); } //...Etc for all the types I expect }

必须有更好的方法,但我找不到它。

我猜有一种方法可以使用myObjectNode.set(key, getValueNode(value));但是我现在还不清楚。例如I can write the value out as a string但我需要它作为我可以在我的ObjectNode上设置的东西,并且需要是正确的类型(即一切都不能只是转换为字符串)。

2 个答案:

答案 0 :(得分:5)

使用ObjectMapper#convertValue方法将对象转换为JsonNode实例。这是一个例子:

public class JacksonConvert {
    public static void main(String[] args) {
        final ObjectMapper mapper = new ObjectMapper();
        final ObjectNode root = mapper.createObjectNode();
        root.set("integer", mapper.convertValue(1, JsonNode.class));
        root.set("string", mapper.convertValue("string", JsonNode.class));
        root.set("bool", mapper.convertValue(true, JsonNode.class));
        root.set("array", mapper.convertValue(Arrays.asList("a", "b", "c"), JsonNode.class));
        System.out.println(root);
    }
}

输出:

{"integer":1,"string":"string","bool":true,"array":["a","b","c"]}

答案 1 :(得分:1)

使用put()方法要容易得多:

ObjectMapper mapper = new ObjectMapper();
ObjectNode root = mapper.createObjectNode();

root.put("name1", 1);
root.put("name2", "someString");

ObjectNode child = root.putObject("child");
child.put("name3", 2);
child.put("name4", "someString");