第二章寫了一種自己寫的方法來查找json字符串中的值,其實jackson還提供一個find方法來查找json字符串中的值。今天我們一起來看看這個方法的使用……
按照慣例我先貼上代碼
/**
* 具體的類我就不貼出來浪費空間了
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 準備數據
List<Person> pers = new ArrayList<Person>();
List<Person> childs = new ArrayList<Person>();
Person p = new Person("張三", 46);
childs.add(new Person("小張三1", 20));
childs.add(new Person("小張三2", 17));
p.setChilds(childs);
pers.add(p);
p = new Person("李四", 29);
childs = new ArrayList<Person>();
childs.add(new Person("小李四1", 20));
p.setChilds(childs);
pers.add(p);
p = new Person("王二麻子", 23);
pers.add(p);
TestVo vo = new TestVo(null, pers);
ObjectMapper mapper = JsonProcessUtil.getMapperInstance(false);
String voJson = JsonProcessUtil.toJson(vo);
JsonNode node = mapper.readTree(voJson);
getValueByFind(node, "age");
getFirstValueByFind(node, "age");
}
哈哈,這樣寫是不是比第二篇裏面的方便多了?但是有個缺點啊,不能指定路徑。也就是說它會把當前json字符串中的所有匹配屬性的值都取出來,如果你沒有指定路徑的要求 這種方法無疑很方便。
好了貼上兩個方法的代碼……
/**
* 使用find的方法從實體中取出所有匹配的值
*
* @param vo
* @param path
* @return
*/
public static List<String> getValueByFind(JsonNode node, String path) throws Exception {
List<String> values = new ArrayList<String>();
/*
* values = node.findValuesAsText(path); 這裏提供兩種方法 一種是隻填寫path
* 它會返回List<String>,另外一種就是下面用的 它會直接把找到的value填到你傳入的集合中
*/
node.findValuesAsText(path, values);
System.out.println(Arrays.toString(values.toArray()));
return values;
}
/**
* 查找當前Node中第一個匹配的值
*
* @param node
* @param path
* @return
* @throws Exception
*/
public static int getFirstValueByFind(JsonNode node, String path) throws Exception {
/*
* 注意這點不能使用getTextValue()方法,因爲找到的值爲Int類型的所以使用getTextValue是查不到值的。
* 不過如果想返回String字符串可以使用asText()方法。這裏使用asInt是爲了看到其實JackSon是可以直接返回相應類型的值的。
*/
int value = node.findValue(path).asInt();
System.out.println(value);
return value;
}