JSON与java对象(含泛型嵌套)互转

目录

 

1.JSON转POJO IDEA插件

RoboPOJOGenerator

2.代码转换

2.1 FastJson

2.1.1 java对象转json

2.1.2 java对象转不同(驼峰、蛇形、帕斯卡等)格式字段的json

2.1.3 json格式字符串根据不同属性策略转java对象

 


1.JSON转POJO IDEA插件

RoboPOJOGenerator

RoboPOJOGenerator是JSON转POJO的IDEA插件,支持将JSON转换为Java或者Kotlin两种语言的POJO。还支持GSON, FastJSON, AutoValue (GSON), Logan Square, Jackson这些JSON框架,方便序列化和反序列化。

{
    "code": 0,
    "msg": "testZero",
    "result": {
        "list": [
            {
                "age": 10,
                "customerName": "xiao-ming",
                "money": 99.99
            },
            {
                "age": 11,
                "customerName": "xiao-hong",
                "money": 88.88
            }
        ],
        "memberId": 10000,
        "memberName": "7-11"
    }
}

安装插件->new->Generate POJO from Json

会生成一些实体类,根据需要自己改改,能节省一些时间吧。

 

2.代码转换

2.1 FastJson

定义实体

import lombok.Data;
import java.io.Serializable;

@Data
public class TestModelZero<T> implements Serializable {
    private static final long serialVersionUID = -2436972763295838439L;
    private Integer code;
    private String msg;
    private T result;
}

import lombok.Data;
import java.io.Serializable;
import java.util.List;

@Data
public class TestModelOne<T> implements Serializable {
    private static final long serialVersionUID = 4299844634380400999L;
    private Long memberId;
    private String memberName;
   private List<T> t;
}

import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;

@Data
public class TestModelTwo implements Serializable {
    private static final long serialVersionUID = 3867753993122188180L;
    private String customerName;
    private Integer age;
    private BigDecimal money;
}

2.1.1 java对象转json

测试代码

import com.alibaba.fastjson.JSONObject;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        TestModelTwo xiaoMingTest = new TestModelTwo();
        xiaoMingTest.setAge(10);
        xiaoMingTest.setCustomerName("xiao-ming");
        xiaoMingTest.setMoney(new BigDecimal("99.99"));

        TestModelTwo xiaoHongTest = new TestModelTwo();
        xiaoHongTest.setAge(11);
        xiaoHongTest.setCustomerName("xiao-hong");
        xiaoHongTest.setMoney(new BigDecimal("88.88"));

        List<TestModelTwo> list = new ArrayList<>();
        list.add(xiaoMingTest);
        list.add(xiaoHongTest);

        TestModelOne<TestModelTwo> testModelOne = new TestModelOne<>();
        testModelOne.setMemberId(10000L);
        testModelOne.setMemberName("7-11");
        testModelOne.setList(list);

        TestModelZero<TestModelOne<TestModelTwo>> testModelOneTestModelZero = 
            new TestModelZero<>();
        testModelOneTestModelZero.setCode(0);
        testModelOneTestModelZero.setMsg("testZero");
        testModelOneTestModelZero.setResult(testModelOne);

        String json = JSONObject.toJSONString(testModelOneTestModelZero);
        System.out.println(json);
    }
}

测试结果

{
    "code": 0,
    "msg": "testZero",
    "result": {
        "list": [
            {
                "age": 10,
                "customerName": "xiao-ming",
                "money": 99.99
            },
            {
                "age": 11,
                "customerName": "xiao-hong",
                "money": 88.88
            }
        ],
        "memberId": 10000,
        "memberName": "7-11"
    }
}

2.1.2 java对象转不同(驼峰、蛇形、帕斯卡等)格式字段的json

测试代码

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.serializer.SerializeConfig;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        TestModelTwo xiaoMingTest = new TestModelTwo();
        xiaoMingTest.setAge(10);
        xiaoMingTest.setCustomerName("xiao-ming");
        xiaoMingTest.setMoney(new BigDecimal("99.99"));

        TestModelTwo xiaoHongTest = new TestModelTwo();
        xiaoHongTest.setAge(11);
        xiaoHongTest.setCustomerName("xiao-hong");
        xiaoHongTest.setMoney(new BigDecimal("88.88"));

        List<TestModelTwo> list = new ArrayList<>();
        list.add(xiaoMingTest);
        list.add(xiaoHongTest);

        TestModelOne<TestModelTwo> testModelOne = new TestModelOne<>();
        testModelOne.setMemberId(10000L);
        testModelOne.setMemberName("7-11");
        testModelOne.setList(list);

        TestModelZero<TestModelOne<TestModelTwo>> testModelOneTestModelZero = 
            new TestModelZero<>();
        testModelOneTestModelZero.setCode(0);
        testModelOneTestModelZero.setMsg("testZero");
        testModelOneTestModelZero.setResult(testModelOne);
        
        // 序列化配置
        SerializeConfig config = new SerializeConfig();
        // 属性名称策略
        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        String json = JSONObject.toJSONString(testModelOneTestModelZero, config);
        System.out.println(json);
    }
}

支持策略:

  • CamelCase
  • PascalCase
  • SnakeCase
  • KebabCase
  • NoChange

 

测试结果

{
    "code": 0,
    "msg": "testZero",
    "result": {
        "list": [
            {
                "age": 10,
                "customer_name": "xiao-ming",
                "money": 99.99
            },
            {
                "age": 11,
                "customer_name": "xiao-hong",
                "money": 88.88
            }
        ],
        "member_id": 10000,
        "member_name": "7-11"
    }
}

2.1.3 json格式字符串根据不同属性策略转java对象

测试代码

 

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.ParserConfig;
import static com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE;
public class Test {
    public static void main(String[] args) {
        String jsonStr = "{\n" +
                "    \"code\": 0,\n" +
                "    \"msg\": \"testZero\",\n" +
                "    \"result\": {\n" +
                "        \"list\": [\n" +
                "            {\n" +
                "                \"age\": 10,\n" +
                "                \"customer_name\": \"xiao-ming\",\n" +
                "                \"money\": 99.99\n" +
                "            },\n" +
                "            {\n" +
                "                \"age\": 11,\n" +
                "                \"customer_name\": \"xiao-hong\",\n" +
                "                \"money\": 88.88\n" +
                "            }\n" +
                "        ],\n" +
                "        \"member_id\": 10000,\n" +
                "        \"member_name\": \"7-11\"\n" +
                "    }\n" +
                "}";

        ParserConfig parserConfig = new ParserConfig();
        parserConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        TypeReference typeReference = 
            new TypeReference<TestModelZero<TestModelOne<TestModelTwo>>>(){};
        TestModelZero<TestModelOne<TestModelTwo>> testModelOneTestModelZero =
                toTrans(jsonStr, typeReference, parserConfig);
    }
    
    private static <T> T toTrans(String jsonStr, 
                                TypeReference typeReference, 
                                ParserConfig parserConfig) {
        return (T)(JSONObject.parseObject(
            jsonStr, typeReference.getType(), parserConfig, DEFAULT_PARSER_FEATURE));
    }
}

测试结果

 

 

 

 

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值