Java JSON组装和解析

使用com.alibaba.fastjson包来进行Json的组装和解析
在组装和解析时,避免使用map去手动拼装,而应该使用类对应一个json对象。
不期望的代码:

    private Map<String, Object> getJsonMap(String userName,
                                           String salt,
                                           Integer id) {
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("userName", userName);
        jsonMap.put("salt", salt);
        jsonMap.put("id", id);
        return jsonMap;
    }

组装Json

组装如下的json

{
	"CloudUserList": [
		{
			"CloudUser": {
				"id": 1,
				"salt": "salt",
				"userName": "Willow1"
			}
		},
		{
			"CloudUser": {
				"id": 2,
				"salt": "salt2",
				"userName": "Willow2"
			}
		}
	]
}

对应的类:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

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

@Data
public class UserData {
    @JSONField(name = "CloudUserList")
    private List<ListInfo> cloudUserList;

    @Data
    public static class ListInfo{
        @JSONField(name = "CloudUser")
        CloudUser cloudUser;
    }
    @Data
    public static class CloudUser{
        private String userName;
        private String salt;
        private Integer id;
    }

	//测试
    public static void main(String[] args){
        UserData data = new UserData ();
        UserData.CloudUser one = new UserData.CloudUser();
        one.setId(1);
        one.setUserName("Willow1");
        one.setSalt("salt");

        UserData.CloudUser two = new UserData.CloudUser();
        two.setId(2);
        two.setUserName("Willow2");
        two.setSalt("salt2");

        UserData.ListInfo listOne = new UserData.ListInfo();
        listOne.setCloudUser(one);
        UserData.ListInfo listTwo = new UserData.ListInfo();
        listTwo.setCloudUser(two);
        List<UserData.ListInfo> list = new ArrayList<>();
        data.setCloudUserList(list);
        list.add(listOne);
        list.add(listTwo);

        String res = JSON.toJSONString(data);
        System.out.println(res);
    }
}

打印结果与预期一致。
需要注意的是json的层次结构,CloudUserList里是还有一层,再里面才是每个CloudUser对象。

解析Json

解析Json成指定类:

{
	"statusCode": 99,
	"statusString": "Batch Processing",
	"subStatusCode": "allSuccess",
	"errorCode": 1,
	"errorMsg": "allSuccess",
	"Info": {
		"StatusList": [
			{
				"Status": {
					"no": 1,
					"statusCode": 1,
					"statusString": "OK",
					"subStatusCode": "ok",
					"errorCode": 1,
					"errorMsg": "ok",
				}
			},
			{
				"Status": {
					"no": 2,
					"statusCode": 1,
					"statusString": "OK",
					"subStatusCode": "ok",
					"errorCode": 1,
					"errorMsg": "ok",
				}
			},
			{
				"Status": {
					"no": 3,
					"statusCode": 1,
					"statusString": "OK",
					"subStatusCode": "ok",
					"errorCode": 1,
					"errorMsg": "ok",
				}
			}
		]
	}
}

对应的类:

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

import java.util.List;

@Data
public class UserResDto {

    private String statusCode;

    private String statusString;

    private String subStatusCode;

    private Integer errorCode;

    private String errorMsg;

    @JSONField(name ="Info" )
    private Info info;

    @Data
    public static class Info {
        private List<StatusInfo> statusList;
    }

    @Data
    public static class StatusInfo {
        private Status Status;
    }

    @Data
    public static class Status {
        private Integer no;
        private String statusCode;
        private String statusString;
        private String subStatusCode;
        private Integer errorCode;
        private String errorMsg;
    }

    public static void main(String[] args) {
        String json = "{\n" +
                "\t\"statusCode\": 99,\n" +
                "\t\"statusString\": \"Batch Processing\",\n" +
                "\t\"subStatusCode\": \"allSuccess\",\n" +
                "\t\"errorCode\": 1,\n" +
                "\t\"errorMsg\": \"allSuccess\",\n" +
                "\t\"Info\": {\n" +
                "\t\t\"StatusList\": [\n" +
                "\t\t\t{\n" +
                "\t\t\t\t\"Status\": {\n" +
                "\t\t\t\t\t\"no\": 1,\n" +
                "\t\t\t\t\t\"statusCode\": 1,\n" +
                "\t\t\t\t\t\"statusString\": \"OK\",\n" +
                "\t\t\t\t\t\"subStatusCode\": \"ok\",\n" +
                "\t\t\t\t\t\"errorCode\": 1,\n" +
                "\t\t\t\t\t\"errorMsg\": \"ok\",\n" +
                "\t\t\t\t}\n" +
                "\t\t\t},\n" +
                "\t\t\t{\n" +
                "\t\t\t\t\"Status\": {\n" +
                "\t\t\t\t\t\"no\": 2,\n" +
                "\t\t\t\t\t\"statusCode\": 1,\n" +
                "\t\t\t\t\t\"statusString\": \"OK\",\n" +
                "\t\t\t\t\t\"subStatusCode\": \"ok\",\n" +
                "\t\t\t\t\t\"errorCode\": 1,\n" +
                "\t\t\t\t\t\"errorMsg\": \"ok\",\n" +
                "\t\t\t\t}\n" +
                "\t\t\t},\n" +
                "\t\t\t{\n" +
                "\t\t\t\t\"Status\": {\n" +
                "\t\t\t\t\t\"no\": 3,\n" +
                "\t\t\t\t\t\"statusCode\": 1,\n" +
                "\t\t\t\t\t\"statusString\": \"OK\",\n" +
                "\t\t\t\t\t\"subStatusCode\": \"ok\",\n" +
                "\t\t\t\t\t\"errorCode\": 1,\n" +
                "\t\t\t\t\t\"errorMsg\": \"ok\",\n" +
                "\t\t\t\t}\n" +
                "\t\t\t}\n" +
                "\t\t]\n" +
                "\t}\n" +
                "}";
        UserResDto dto = JSONObject.parseObject(json, UserResDto.class);
        System.out.println(dto);
    }
}

输出结果中无null值,每个成员变量均赋值成功。
注意"Status"与"StatusList"中间还隔着一层,虽然没有具体名字的json字段,但是对应一个类StatusInfo。

其他简单的json序列化和反序列化均可参考此例进行拓展。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值