Json字符串与Java对象的相互转换

JavaObject转Json字符串

fastJson的教程

gson的教程

  • fastJson

    String jsonStr = JSONObject.toJSONString(obj);
    
  • gson

    Gson gson = new Gson();
    String toJson = gson.toJson(obj);
    

Json字符串转JavaObject

  • fastJson

    String jsonStr="{\"content\":\"test\",\"id\":1,\"innerEntities\":[{\"name\":\"0\",\"startTime\":1628067696095},{\"name\":\"1\",\"startTime\":1628067696095},{\"name\":\"2\",\"startTime\":1628067696095}],\"spuId\":1}";
    Entity entity = JSON.parseObject(jsonStr, Entity.class);
    

    如果要将javaObject的属性名是以驼峰命名如:startTime,而json是以形如:start_time的话则无法给javaObject注入对应的值。

    解决方法:

    在javaObject对应的字段属性添加@JSONField(name = "start_time")即可完成相应的映射。

  • gson

    Gson gson = new Gson();
    String jsonStr="{\"content\":\"test\",\"id\":1,\"innerEntities\":[{\"name\":\"0\",\"startTime\":1628067696095},{\"name\":\"1\",\"startTime\":1628067696095},{\"name\":\"2\",\"startTime\":1628067696095}],\"spuId\":1}";
    Entity entity = gson.fromJson(jsonStr, Entity.class);
    

    上述驼峰命名的转换问题,gson的解决方式如下:

    //在new Gson()时,使用工厂模式构建,设置对应的映射关系即可
    Gson gson = new Gson()
        .newBuilder()
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
        .create();
    

    使用gson转换时,还会出现一个问题,就是解析时间戳时会报错,解决方式是:

    参考的博客

    //官网上说,在处理日期类型的时候经常出现内置转换器无法转换成功的情况,需要我们自己去定义一个转换器去进行转换,然后也告知了我们如何去定义自己的转换器,如下代码以Date类型示例:
    
    // 创建gson对象构建器
    GsonBuilder gsonBuilder = new GsonBuilder();
    // 实现将long 类型的日期格式转换为国际标准格式
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            return new Date(json.getAsJsonPrimitive().getAsLong());
        }
    });
    // 创建gson对象
    Gson gson = gsonBuilder.create();
    

    参考以上的代码,也可以完成对应其他类型的字段自定义转换器。

上一篇:JSON解析详细步骤


下一篇:json入门