ObjectMapper实现Json、JsonNode、JsonObject等转换
有些时候,我们要处理的 json,是不可以直接转换为javaBean处理滴,比如一些中文字段名,总不能在代码 对象里给属性都定义成中文,,,,那怎么搞,来下边这些东西帮你搞。
我遇到的场景就是要把,hbase中存储的json文本拿出来,转换存至数据库表(mysql)中
而hbase中存储的json文本都是中英混合的字段名,so…
Json、JsonNode、JsonObject的区别
- json是一个字符串
- jsonNode是一个对象,键值对类型,可以根据key获取值
- jsonObject是一个对象
Json字符串转换成JsonNode对象
String json = "xxxx";
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(json)
JsonNode 的 fieldNames
方法可以获取所有的 key值
Iterator<String> stringIterator = jsonNode.fieldNames();
while (stringIterator.hasNext()) {
stringIterator.next();
}
根据key获取值,value可能为子节点 JsonNode 或 String
JsonNode node1 = mapper.readTree(json);
// "key":"value"
// 通过key获取JsonNode节点
JsonNode node2 = node1.get("key"); // 输出为 "value" 带有双引号,属于JsonNode类型
// 获取节点的String值
String s = node2.asText; // 输出为 value, 属于String类型
如果是一个JsonNode数组,处理
使用JsonNode.elements( ); 读取数组中每个node
如果不是JsonNode数组,JsonNode.elements( );方法返回JsonNodes中的values
**注意:使用迭代器时,因为迭代器的自身特性(next指针移动读取元素),最好是在开始首行接收到 xxx.next( )的值,然后再进行处理,避免出错。
进行list的迭代删除元素操作时,需要使用迭代器的 remove( )方法,而不是list自身的,否则出错。
// jsonNode1为数组形式, 即在json字符串中为 array形式, 利用json在线解析工具可以看出来
Iterator<JsonNode> elements = jsonNode1.elements();
while (elements.hasNext()) {
JsonNode jsonNode = elements.next();
String s1 = elements.next().asText();
}
后
- JsonNode.get( “aaaa”)
得到 JsonNode 结点
- JsonNode.asText( )
asText()是JsonNode的一个抽象方法public abstract String asText();被TextNode继承并重写了这个方法,直接输出文本内容。(去掉双引号)
带有双引号的数据 非String类型,而是以 JsonNode的形式存在
- JsonNodeisArray()
isArray()方法能够判断该 JsonNode是否是一个 array
Json字符串转换为JsonObject
String json = "xxx";
JSONObject jsonObject = JSON.parseObject(json);
// JsonObject对象转换为JavaBean 不推荐,太麻烦,直接上fastjson 或者其它的
Student student = object.toJavaObject(Student.class);
其余的见edge收藏。。。。写给自己的,哈哈