[alibaba/fastjson]怎么把value包含json字符串的也格式化

2025-10-31 179 views
4

demo:


public class Test {

    public static void main(String[] args) {
        JSONObject json = new JSONObject();
        JSONObject value = new JSONObject();
        JSONArray arr = new JSONArray();

        value.put("sex", "男");
        value.put("desc", "这家伙很懒,什么也没留下");

        for (int i = 0; i < 3; i ++) {
            JSONObject o = new JSONObject();
            o.put("key" + i, "value" + i);

            arr.add(o);
        }

        json.put("name", "zhangsan");
        json.put("info", value.toJSONString());
        json.put("arr", arr.toJSONString());

        // 实际应用中json值可能是JSONObject,也可能是JSONArray
        System.out.println(JSON.toJSONString(json, SerializerFeature.PrettyFormat));
    }
}

输出:


{
    "arr":"[{\"key0\":\"value0\"},{\"key1\":\"value1\"},{\"key2\":\"value2\"}]",
    "name":"zhangsan",
    "info":"{\"sex\":\"男\",\"desc\":\"这家伙很懒,什么也没留下\"}"
}

而我想得到如下的格式化的效果:


{
    "arr":[
        {
            "key0":"value0"
        },
        {
            "key1":"value1"
        },
        {
            "key2":"value2"
        }
    ],
    "name":"zhangsan",
    "info":{
        "sex":"男",
        "desc":"这家伙很懒,什么也没留下"
    }
}

请教该如何实现

回答

7

简单,改一下put值就好了,

json.put("info", value);
json.put("arr", arr);

put方法第二个参数是个Object对象。

9

代码只是方便观看的,实际的应用数据是value中有json字符串。 就是说我想把


{
    "arr":"[{\"key0\":\"value0\"},{\"key1\":\"value1\"},{\"key2\":\"value2\"}]",
    "name":"zhangsan",
    "info":"{\"sex\":\"男\",\"desc\":\"这家伙很懒,什么也没留下\"}"
}

格式成:

{
    "arr":[
        {
            "key0":"value0"
        },
        {
            "key1":"value1"
        },
        {
            "key2":"value2"
        }
    ],
    "name":"zhangsan",
    "info":{
        "sex":"男",
        "desc":"这家伙很懒,什么也没留下"
    }
}

js的JSON.parse再JSON.stringify可以做到,但我的程序不涉及前端,纯kotlin

2

@ysdxz207 ,那只能这样了,把arr和info的值取出来做一下判断,如果是字符串类型,就把他们分别JSON.parse(),然后再重新塞回去,不是字符串就照常返回。

6

@LSL1618 这个不现实的,因为不知道返回结果嵌套了多少层

8

@ysdxz207 ,那就没办法了,毕竟有的时候可能就是需要传字符串类型,而且循环嵌套之类的也不好控制。

6

demo:


public class Test {

    public static void main(String[] args) {
        JSONObject json = new JSONObject();
        JSONObject value = new JSONObject();
        JSONArray arr = new JSONArray();

        value.put("sex", "男");
        value.put("desc", "这家伙很懒,什么也没留下");

        for (int i = 0; i < 3; i ++) {
            JSONObject o = new JSONObject();
            o.put("key" + i, "value" + i);

            arr.add(o);
        }

        json.put("name", "zhangsan");
        json.put("info", value.toJSONString());
        json.put("arr", arr.toJSONString());

        // 实际应用中json值可能是JSONObject,也可能是JSONArray
        System.out.println(JSON.toJSONString(json, SerializerFeature.PrettyFormat));
    }
}

输出:


{
  "arr":"[{\"key0\":\"value0\"},{\"key1\":\"value1\"},{\"key2\":\"value2\"}]",
  "name":"zhangsan",
  "info":"{\"sex\":\"男\",\"desc\":\"这家伙很懒,什么也没留下\"}"
}

而我想得到如下的格式化的效果:


{
  "arr":[
      {
          "key0":"value0"
      },
      {
          "key1":"value1"
      },
      {
          "key2":"value2"
      }
  ],
  "name":"zhangsan",
  "info":{
      "sex":"男",
      "desc":"这家伙很懒,什么也没留下"
  }
}

请教该如何实现

@LSL1618 JSON.toJSONString方法是没法将字符串内部的字符串进一步序列化的。以下方法可以实现你的需求:

json.put("info", value.toJSONString());  // 不要将value转化成为string
json.put("arr", arr.toJSONString());