jsonString和对象互转场景验证

在排查线上问题时,出现了json转dto对象时报错的情况,于是基于com.alibaba.fastjson.JSON进行了一系列验证过程。

类JsonDto

package com.json;

import com.alibaba.fastjson.JSON;

import java.util.List;
import java.util.Map;

public class JsonDto {

    /**
     * 字符串
     */
    private String str;

    /**
     * list集合
     */
    private List<String> list;

    /**
     * map对象
     */
    private Map<String, String> map;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "JsonDto{" +
                "str=" + str +
                ", list=" + JSON.toJSONString(list) +
                ", map=" + JSON.toJSONString(map) +
                '}';
    }
}

类StringNameNotSameDto

package com.json;

import com.alibaba.fastjson.JSON;

import java.util.List;
import java.util.Map;

public class StringNameNotSameDto {

    /**
     * 字符串
     */
    private String str2;

    /**
     * list集合
     */
    private List<String> list;

    /**
     * map对象
     */
    private Map<String, String> map;

    public String getStr2() {
        return str2;
    }

    public void setStr2(String str2) {
        this.str2 = str2;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "StringNameNotSameDto{" +
                "str2=" + str2 +
                ", list=" + JSON.toJSONString(list) +
                ", map=" + JSON.toJSONString(map) +
                '}';
    }
}

类StringTypeNotSameDto

package com.json;

import com.alibaba.fastjson.JSON;

import java.util.List;
import java.util.Map;

public class StringTypeNotSameDto {

    /**
     * 字符串
     */
    private List<String> str;

    /**
     * list集合
     */
    private List<String> list;

    /**
     * map对象
     */
    private Map<String, String> map;

    public List<String> getStr() {
        return str;
    }

    public void setStr(List<String> str) {
        this.str = str;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "StringTypeNotSameDto{" +
                "str=" + JSON.toJSONString(str) +
                ", list=" + JSON.toJSONString(list) +
                ", map=" + JSON.toJSONString(map) +
                '}';
    }
}

类StringTypeNotSame2Dto

package com.json;

import com.alibaba.fastjson.JSON;

import java.util.List;
import java.util.Map;

public class StringTypeNotSame2Dto {

    /**
     * 字符串
     */
    private NewDto str;

    /**
     * list集合
     */
    private List<String> list;

    /**
     * map对象
     */
    private Map<String, String> map;

    public NewDto getStr() {
        return str;
    }

    public void setStr(NewDto str) {
        this.str = str;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "StringTypeNotSameDto{" +
                "str=" + JSON.toJSONString(str) +
                ", list=" + JSON.toJSONString(list) +
                ", map=" + JSON.toJSONString(map) +
                '}';
    }
}

类ListTypeNotSameDto

package com.json;

import com.alibaba.fastjson.JSON;

import java.util.List;
import java.util.Map;

public class ListTypeNotSameDto {

    /**
     * 字符串
     */
    private String str;

    /**
     * list集合
     */
    private String list;

    /**
     * map对象
     */
    private Map<String, String> map;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public String getList() {
        return list;
    }

    public void setList(String list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "ListTypeNotSameDto{" +
                "str=" + str +
                ", list=" + JSON.toJSONString(list) +
                ", map=" + JSON.toJSONString(map) +
                '}';
    }
}

类NewDto

package com.json;

public class NewDto {

    /**
     * 字符串
     */
    private String id;

    /**
     * 字符串
     */
    private String name;

    /**
     * 字符串
     */
    private String address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "JsonDto{" +
                "id=" + id +
                ", name=" + name +
                ", address=" + address +
                '}';
    }
}

主类JSON2ObjectMain

package com.json;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

public class JSON2ObjectMain {

    public static void main(String[] args) {
        JsonDto dto = new JsonDto();
        // dto没有值时:
        String dto2Json = JSON.toJSONString(dto);
        System.out.println("dto to json string:" + dto2Json);
        JsonDto json2Dto = JSON.parseObject(dto2Json, JsonDto.class);
        System.out.println("json string to dto:" + json2Dto.toString());
        System.out.println();

        // dto部分属性有值时:
        dto.setStr("string test");
        dto2Json = JSON.toJSONString(dto);
        System.out.println("dto to json string:" + dto2Json);
        json2Dto = JSON.parseObject(dto2Json, JsonDto.class);
        System.out.println("json string to dto:" + json2Dto.toString());
        System.out.println();

        // 当json串中部分字段名不匹配时:不报错,不匹配的字段没有值
        StringNameNotSameDto stringNameNotSameDto = new StringNameNotSameDto();
        stringNameNotSameDto.setStr2("string2");
        String stringNameNotSameDto2Json = JSON.toJSONString(stringNameNotSameDto);
        System.out.println("stringNameNotSameDto to json string:" + stringNameNotSameDto2Json);
        StringNameNotSameDto similarJson2Dto = JSON.parseObject(stringNameNotSameDto2Json, StringNameNotSameDto.class);
        System.out.println("json string to stringNameNotSameDto:" + similarJson2Dto.toString());
        json2Dto = JSON.parseObject(stringNameNotSameDto2Json, JsonDto.class);
        System.out.println("json string(stringNameNotSameDto) to dto:" + json2Dto.toString());
        System.out.println();

        // 当json串中部分字段,字段名相同但字段类型不匹配时(json中list是String类型,dto中list是List<String>):不报错
        ListTypeNotSameDto listTypeNotSameDto = new ListTypeNotSameDto();
        listTypeNotSameDto.setList("list value");
        String listTypeNotSameDto2Json = JSON.toJSONString(listTypeNotSameDto);
        System.out.println("listTypeNotSameDto to json string:" + listTypeNotSameDto2Json);
        ListTypeNotSameDto listTypeNotSameDto2Json2Dto = JSON.parseObject(listTypeNotSameDto2Json, ListTypeNotSameDto.class);
        System.out.println("json string to listTypeNotSameDto:" + listTypeNotSameDto2Json2Dto.toString());
        json2Dto = JSON.parseObject(listTypeNotSameDto2Json, JsonDto.class);
        System.out.println("json string(listTypeNotSameDto) to dto:" + json2Dto.toString());
        System.out.println();

        // 当json串中部分字段,字段名相同但字段类型不匹配时(json中str是List<String>类型,dto中str是String):不报错
        StringTypeNotSameDto stringTypeNotSameDto = new StringTypeNotSameDto();
        List<String> list = new ArrayList<>();
        list.add("001");
        list.add("002");
        stringTypeNotSameDto.setStr(list);
        String stringTypeNotSameDto2Json = JSON.toJSONString(stringTypeNotSameDto);
        System.out.println("stringTypeNotSameDto to json string:" + stringTypeNotSameDto2Json);
        StringTypeNotSameDto stringTypeNotSameJson2Dto = JSON.parseObject(stringTypeNotSameDto2Json, StringTypeNotSameDto.class);
        System.out.println("json string to stringTypeNotSameDto:" + stringTypeNotSameJson2Dto.toString());
        json2Dto = JSON.parseObject(stringTypeNotSameDto2Json, JsonDto.class);
        System.out.println("json string(stringTypeNotSameDto) to dto:" + json2Dto.toString());
        System.out.println("+++" + json2Dto.getStr() + "+++");
        System.out.println();

        // 当json串中部分字段,字段名相同但字段类型不匹配时(json中str是NewDto类型,dto中str是String):不报错
        StringTypeNotSame2Dto stringTypeNotSame2Dto = new StringTypeNotSame2Dto();
        NewDto newDto = new NewDto();
        newDto.setId("001");
        newDto.setName("this is name");
        stringTypeNotSame2Dto.setStr(newDto);
        String stringTypeNotSame2Dto2Json = JSON.toJSONString(stringTypeNotSame2Dto);
        System.out.println("stringTypeNotSame2Dto to json string:" + stringTypeNotSame2Dto2Json);
        StringTypeNotSame2Dto stringTypeNotSame2Json2Dto = JSON.parseObject(stringTypeNotSame2Dto2Json, StringTypeNotSame2Dto.class);
        System.out.println("json string to stringTypeNotSame2Dto:" + stringTypeNotSame2Json2Dto.toString());
        json2Dto = JSON.parseObject(stringTypeNotSame2Dto2Json, JsonDto.class);
        System.out.println("json string(stringTypeNotSame2Dto) to dto:" + json2Dto.toString());
        System.out.println("+++" + json2Dto.getStr() + "+++");
        System.out.println();
    }
}

验证结论:如果属性名称不一致,则不会赋值成功(但不会报错),如果属性名称一致,但类型不一致,也会赋值成功。

 

posted on 2023-01-03 15:56  阿泰555  阅读(80)  评论(0编辑  收藏  举报

导航