Java实体和JSON之间的相互转换

一、先写一个测试用的Java实体

二、将Java实体转化为Json

1、基于com.alibaba.fastjson.JSON

(1)、JSON.toJSONString(user),会丢掉值为空的字段。
(2)、JSON.toJSONString(user, SerializerFeature.WriteMapNullValue),保留值为空的字段,并初始化为null。
(3)、JSON.toJSONString(user, SerializerFeature.WriteNonStringValueAsString),会将非空的字段值加上"“,并丢掉没有初始化的字段。
(4)、JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty),会将String类型的字段加上”“,没有显示初始化的String类型参数保留,保留默认初始化为null的字段,同时丢掉其他未初始化的、非String类型的字段。
(5)、JSON.toJSONString(user, SerializerFeature.WriteNullListAsEmpty),会非空、String类型的字段加上”“,保留默认初始化为null的字段,同时丢掉其他未初始化的、非String类型的字段。
(6)、JSON.toJSONString(user, SerializerFeature.QuoteFieldNames),转化之后的字段名会加上”",和默认一样。
(7)、JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat),转化之后Date类型为传入格式,默认是时间戳。
(8)、JSON.toJSONString(user, SerializerFeature.WriteNullNumberAsZero),转化之后会将没有初始化的数字类型(BigDecimal、Float、Double)字段初始化为0,保留初始化为null的字段,丢掉其他类型未显示初始化的字段。
(9)、JSON.toJSONString(user, SerializerFeature.WriteNullBooleanAsFalse),转化之后会将没有初始化的Boolean类型字段初始化为false,保留初始化为null的字段,丢掉其他类型未显示初始化的字段。
(10)、JSON.toJSONString(user, SerializerFeature.PrettyFormat),格式化Json,丢掉其他未显示初始化的字段。

2、基于com.alibaba.fastjson.JSONObject

JSONObject是JSON的子类,并且没有重写“toJSONString”方法,所以效果是一样的。

3、基于com.fasterxml.jackson.databind.ObjectMapper的writeValueAsString方法

writeValueAsString方法会保留没有显示初始化的的字段,除了char类型初始化值为“\u0000”,其他都为“null”。

4、基于com.google.gson.Gson的toJson方法。

(1)、直接实例化一个Gson,将Java实体传入实例中的toJson,会丢掉没有初始化的字段。
char类型还是保留下来了。
(2)、在转化为json的同时,保留没有显示初始化的字段。
“Gson gson = new Gson();”只能简单地将Java实体转为json,要保留没有显示初始化的字段,需要用到“GsonBuilder”初始化“Gson”,代码如下

Gson gson = new GsonBuilder()
    .serializeNulls()
    .create();

String gsonStr1 = gson.toJson(user);

没有显示初始化的字段都保留下来了,并且值都为“null”。

(3)、设置时间格式。

Gson gson = new GsonBuilder()
    .serializeNulls()
    .setDateFormat("yyyy年MM月dd日 HH:mm:ss")
    .create();

String gsonStr1 = gson.toJson(user);

(4)、格式化输出。
如果觉得转换之后的json只有一行不好看,可以使用“setPrettyPrinting”格式化json的格式,代码如下:

Gson gson = new GsonBuilder()
    .serializeNulls()
    .setDateFormat("yyyy年MM月dd日 HH:mm:ss")
    .setPrettyPrinting()
    .create();

String gsonStr1 = gson.toJson(user);

三、将Json转换为Java实体

1、先拿到测试Json

使用JSON的parseObject(String text, Class clazz)方法可以直接将Json字符转化为对应clazz的Java实体,代码如下:

2、基于com.alibaba.fastjson.JSON

3、基于com.alibaba.fastjson.JSONObject

JSONObject中转化Java实体的方法parseObject也是来自JSON,并且没有重写,效果是一样的,代码如下:

4、基于com.fasterxml.jackson.databind.ObjectMapper的readValue方法

String userJson = "{\"adult\":true,\"adultDesc\":null,\"age\":25,\"ageDesc\":null,\"birthday\":908169922000,\"birthdayDesc\":null,\"height\":180.0,\"heightDesc\":null,\"money\":2104.5,\"moneyDesc\":null,\"name\":\"王宇\",\"nameDesc\":null,\"sex\":\"男\",\"sexDesc\":\"\\u0000\",\"weight\":71.55,\"weightDesc\":null}";
System.out.println("userJson:" + userJson);

ObjectMapper objectMapper = new ObjectMapper();
try {
    User user = objectMapper.readValue(userJson, User.class);
    System.out.println("user:" + user);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

5、基于com.google.gson.Gson

Gson gson = new Gson();
这种写法 存在日期可能会报错

String userJson = "{\"adult\":true,\"adultDesc\":null,\"age\":25,\"ageDesc\":null,\"birthday\":908169922000,\"birthdayDesc\":null,\"height\":180.0,\"heightDesc\":null,\"money\":2104.5,\"moneyDesc\":null,\"name\":\"王宇\",\"nameDesc\":null,\"sex\":\"男\",\"sexDesc\":\"\\u0000\",\"weight\":71.55,\"weightDesc\":null}";
System.out.println("userJson:" + userJson);

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
            @Override
            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                return new Date(json.getAsJsonPrimitive().getAsLong());
            }
        })
        .create();
User user = gson.fromJson(userJson, User.class);
System.out.println("user:" + user);


  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值