1. 程式人生 > 其它 >Json字串與Java物件的相互轉換

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();
    

    參考以上的程式碼,也可以完成對應其他型別的欄位自定義轉換器。