java json对象转json字符串(带转义符)(json对象嵌套json字符串) 202558007编辑

Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注

java json对象转json字符串(带转义符)(json对象嵌套json字符串)

Created by Marydon on 2020-11-12 17:59

1.情景展示

  如上图所示,这一个标准的json字符串,双引号需要使用反斜杠\进行转义,

  一般情况下,我们是用不到这种json字符串的,在java中,json字符串的通常表现形式是这种:

  其本质还是json对象,并不是真正意义上的json字符串(即使将json对象转字符串),哪里会用到上面那种带转义符的json字符串?(下面示例)

  完整请求参数:

  后台用实体类接收,且Person用的是字符串String来接收的 

  一般情况下,是不会出现这种变态需求的,明明是json对象,却用字符串接收,我们通常通过java后台发送http请求时,往往传送的数据格式是这样的:

  而我们一旦使用这种标准的json数据格式发送请求,对方服务器在接收到数据后往Person里塞数据时,将会报错:大致信息是-需要的是字符串,提供的却是json对象。

  ↓↓↓如果是想在json对象里嵌套json字符串,直接看最后↓↓↓

  如何生成这种格式的数据?

2.具体实践

  准备工作:

  JSON对象常用的有两种:一种是net.sf.json.JSONObject,另一种是com.alibaba.fastjson.JSONObect

  错误示例一:调用原生的toString()方法

  这是java形式的json字符串,无论是net的toString()还是ali的toString()、toJSONString()方法,里面存的还是对象,并不是我们想要的结果

  错误示例二:使用FackJson

  import com.fasterxml.jacks on.core.io.JsonStringEncoder;

  这种是javascript形式的json字符串,虽然离目标近了,但还是不是我们想要的结果

  错误示例三:使用StringEscapeUtils

  import org.apache.commons.lang.StringEscapeUtils

  还是不行,生成的也是JavaScript形式的json字符串 

3.解决方案

  方式一:通过Jackson实现

  所需jar包:

1
2
3
4
5
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.10</version>
</dependency>

  导入:

1
2
import com.fasterxml.jackson.core.io.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

  代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
 * json转字符串(带转义符\且两边带双引号)
 * @attention: 与 当formatJson()的入参为json字符串 实现的效果一致
 * @date: 2020年10月24日 0024 10:01
 * @param: json JSONObject/JSONArray
 * @return: java.lang.String 字符串(带转义符\)
 */
public static String toJsonString(Object json) {
    if (null == json) return "";
 
    String jsonStr = "";
 
    // JSONObject,JSONArray 都实现了JSON接口
    if (json instanceof net.sf.json.JSONObject || json instanceof net.sf.json.JSONArray || json instanceof com.alibaba.fastjson.JSONObject || json instanceof com.alibaba.fastjson.JSONArray) {
        Map<String, String> map = new HashMap<>(1);
        ObjectMapper om = new ObjectMapper();
 
        map.put("JSON", json.toString());
        try {
            jsonStr = om.writeValueAsString(map.get("JSON"));
        } catch (JsonProcessingException e) {
            log.error(e.getMessage());
            e.printStackTrace();
            return "";
        }
 
        log.debug("json-->字符串前:\n" + json.toString());
        log.debug("json-->字符串后:\n" + jsonStr);
    } else {
        log.error("不是json格式数据");
    }
 
    return jsonStr;
}

  方式二:通过谷歌的Gson实现

  所需jar包:

1
2
3
4
5
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

  导包:

1
2
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

  代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
 * json对象转格式化后的json字符串
 * @attention: 入参格式不同,返回结果不同
 * @date: 2020年11月12日 0012 15:32
 * @param: json
 *  如果参数是json对象,返回的将是:格式化后的json字符串(小于号>会被转码成\u003c,大于号>会被转码成\u003e,且替换无效);
 *  如果参数是json字符串,返回的将是:带转义符\且两边带双引号的json字符串;
 *  当参数是json字符串时,实现的效果与toJsonString()方法一样
 * @return: java.lang.String
 */
public static String formatJson(Object json) {
    // 非空校验
    if (null == json) return "";
 
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setPrettyPrinting();
    Gson gson = gsonBuilder.create();
    String jsonStr = gson.toJson(json);
    // 替换无效
    // jsonStr = jsonStr.replaceAll("\\u003c","<").replaceAll("\\u003e", ">");
 
    log.debug("json字符串格式化前:\n" + json.toString());
    log.debug("json字符串格式化后:\n" + jsonStr);
    return jsonStr;
}

4.测试  

  测试一:

  上面的这两种方式,会在生成的json字符串两边加上双引号

  测试二:

  方式一:

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
    JSONObject jo = new JSONObject();
    jo.put("name","Marydon");
    jo.put("age",18);
    JSONObject params = new JSONObject();
    params.put("Person", toJsonString(jo));
    params.put("Time", "2020-11-12");
    System.out.println(params.toString().replace("\\\\", ""));
}

  方式二:

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
    JSONObject jo = new JSONObject();
    jo.put("name","Marydon");
    jo.put("age",18);
    JSONObject params = new JSONObject();
    params.put("Person", formatJson(jo.toString()));
    params.put("Time", "2020-11-12");
    System.out.println(params.toString().replace("\\\\", ""));
}

  方式三:

1
2
3
4
5
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.3</version>
</dependency> 

  方式四:Jackson核心包

  如果是json对象嵌套json字符串,则上面4种方式都可以实现(但不一定能用,未测试)。

5.json对象嵌套json字符串

  已知这种数据

  需要转成这种数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
    JSONObject jo = new JSONObject();
    jo.put("name","Marydon");
    jo.put("age",18);
    // 需要转成json字符串,外层必须使用Map组装数据(不能用json)
    Map<String,String> params = new HashMap<>();
    params.put("Person", jo.toString());
    params.put("Time", "2020-11-12");
    try {
        System.out.println(params);
        // 由Jackson将map转成json字符串,再转成json对象
        JSONObject json = JSONObject.fromObject(new ObjectMapper().writeValueAsString(params));
        System.out.println(json);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
 
}

 

2021-06-11

  我发现了一个诡异的情况,那就是:

  Map转Json,当Map的Value带有闭合标签时,转化成json后,会被强制添加转义符"\",一起来看下:

1
2
3
Map<String, Object> map = new HashMap<>(2);
map.put("name", "<Name>Marydon</name>");
map.put("website", "<Blog>https://www.cnblogs.com/Marydon20170307/</Blog>");

  使用net.sf.json将map转json

1
System.out.println(JSONObject.fromObject(map));

  被强制添加了转义符

  解决办法:

  使用com.alibaba.fastjson

1
System.out.println(JSONObject.toJSONString(map));

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。

您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!

↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓

posted @   Marydon  阅读(58004)  评论(2编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示
sorry,本博客所有代码禁止复制,原创代码需扫码支付方可获取!
关闭

1、先加好友再付费,点我加好友;

2、代码不能满足你的需求?加好友付费定制你的专属代码!

3、付费标准及方式,点我查看详情。