ObjectMapper的objectNode、ArrayNode各种转换使用

本文介绍了一个Java代码示例,用于将包含复杂嵌套结构的JSON字符串转换为相应类型的对象。代码处理了基本数据类型、对象和数组,并通过递归实现了动态类型转换。示例中展示了如何根据预定义的属性类型映射转换JSON数据。

在这里插入图片描述

说明

本文章代码出自摸石头过河写出来的,隔天再写不一定写得出来,所以发个文章记录下。

为什么写这个代码
需求要求,有一段json字符串,数据结构是图下这样:

{
   
   
	"id": "1",
	"string": "sb",
	"double": "33",
	"long": "2",
	"boolean": "true",
	"domain": {
   
   
		"id": "1",
		"name": "大白",
		"org": {
   
   
			"code": "1"
		},
		"jd": [{
   
   
			"j": "false",
			"d": "4"
		}, {
   
   
			"j": "true",
			"d": "6"
		}]
	},
	"orgs": [{
   
   
		"code": "bb",
		"id": "true",
		"org": {
   
   
			"code": "1"
		},
		"sb": [{
   
   
			"s": "1"
		}, {
   
   
			"b": "true"
		}]
	}, {
   
   
		"code": "cc",
		"id": "false",
		"org": {
   
   
			"code": "1"
		},
		"sb": [{
   
   
			"s": "2"
		}, {
   
   
			"b": "false"
		}]
	}]
}

可以得知,所有属性都是string类型,又得知有个Attr类,里面放着json属性对应的类型,要求我们如果json里面有属性和Attr类里面名称对应的上,就要把string转换相对应的类型。

以上可能有点绕,举个栗子:图上有个id的属性,它的值是字符串的1,Attr类里面id对应的值是integer,所以最后的结果要是integer类型。

由于json数据结构不可知,只能穷举+递归针对处理:
1、基本数据类型
2、object类型
3、array类型
4、object类型中有array类型
5、array类型中有object类型

实例代码

package com.lq.demo1.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.lq.demo1.entity.Attr;
import com.lq.demo1.entity.Constants;
import lombok.extern.slf4j.Slf4j;

import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
public class TestService {
   
   


    public static void main(String[] args) throws JsonProcessingException {
   
   

        String json = "{\n" +
                "\t\"id\": \"1\",\n" +
                "\t\"string\": \"sb\",\n" +
                "\t\"double\": \"33\",\n" +
                "\t\"long\": \"2\",\n" +
                "\t\"boolean\": \"true\",\n" +
                "\t\"domain\": {\n" +
                "\t\t\"id\": \"1\",\n" +
                "\t\t\"name\": \"大白\",\n" +
                "\t\t\"org\": {\n" +
                "\t\t\t\"code\": \"1\"\n" +
                "\t\t},\n" +
                "\t\t\"jd\": [{\n" +
                "\t\t\t\"j\": \"false\",\n" +
                "\t\t\t\"d\": \"4\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"j\": \"true\",\n" +
                "\t\t\t\"d\": \"6\"\n" +
                "\t\t}]\n" +
                "\t},\n" +
                "\t\"orgs\": [{\n" +
                "\t\t\"code\": \"bb\",\n" +
                "\t\t\"id\": \"true\",\n" +
                "\t\t\"org\": {\n" +
                "\t\t\t\"code\": \"1\"\n" +
                "\t\t},\n" +
                "\t\t\"sb\": [{\n" +
                "\t\t\t\"s\": \"1\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"b\": \"true\"\n" +
                "\t\t}]\n" +
                "\t}, {\n" +
                "\t\t\"code\": \"cc\",\n" +
                "\t\t\"id\": \"false\",\n" +
                "\t\t\"org\": {\n" +
                "\t\t\t\"code\": \"1\"\n" +
                "\t\t},\n" +
                "\t\t\"sb\": [{\n" +
                "\t\t\t\"s\": \"2\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"b\": \"false\"\n" +
                "\t\t}]\n" +
                "\t}]\n" +
                "}";

        log.info("老:{}", json);
        ObjectMapper objectMapper = new ObjectMapper();
        ObjectNode objectNode = (ObjectNode) objectMapper.readTree(json);

        Attr a = Attr.builder().id(1).attributeName("id").attributeType("INTEGER").parentId(-1).build();
        Attr b = Attr.builder().id(2).attributeName("string").attributeType("STRING").parentId(-1).build();
        Attr c = Attr.builde
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值