我需要在给定键和值的情况下向现有ObjectNode
添加新项目。该值在方法sig中指定为Object
,应是ObjectNode.set()接受的类型之一(String
,Integer
,{ {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上设置的东西,并且需要是正确的类型(即一切都不能只是转换为字符串)。
答案 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");