參考:https://ask.csdn.net/questions/323583
json是一個字符串,jsonNode是一個對象!
可以將json轉換成jsonNode,jsonNode中都是鍵值對形式,可以根據Key取出對應的值!
JsonNode 和 json 互轉
import java.io.IOException;
import java.util.Iterator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTest {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
String json = "{\"username\":\"zhangsan\",\"性別\":\"男\",\"company\":{\"companyName\":\"中華\",\"address\":\"北京\"},\"cars\":[\"奔馳\",\"寶馬\"]}";
ObjectMapper mapper = new ObjectMapper();
//JSON ----> JsonNode
JsonNode rootNode = mapper.readTree(json);
Iterator<String> keys = rootNode.fieldNames();
while(keys.hasNext()){
String fieldName = keys.next();
System.out.println(fieldName + ": " + rootNode.path(fieldName).toString());
}
//JsonNode ----> JSON
System.out.println(mapper.writeValueAsString(rootNode));
}
/**
* 將json(json字符串)的fields層級鏈值解析為type類型的對象
* @param json json字符串
* @param clazz 出參類型
* @param fields json中層級鏈,{"a":"","b":""}==>{"a","b"}=fields
* @param <T>
* @return
*/
public static <T> T toObject(String json, Class<T> clazz, String...fields) {
ObjectMapper mapper = new ObjectMapper();
//方便的轉換方法,將給定的JSON樹包含的數據綁定到特定的值(通常是bean)類型。
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNode node;
try {
if (null == json || "".equals(json))
return null;
node = mapper.readTree(json);
if (null != fields && fields.length > 0) {
for(String field : fields) {
node = node.get(field);
}
}//方便的轉換方法,將給定的JSON樹包含的數據綁定到特定的值(通常是bean)類型。
return mapper.treeToValue(node, clazz);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
}
如果json(String)不是一個json格式,mapper.readTree(json)會返回一個null,后面調用會報錯