使用simple json时遇到的一个小问题

发现问题

最近写了个程序,在构建http参数的时候使用到了org.json.simple.JSONObject这个类,上线之后有客户反馈说http参数格式不正确,如果参数中包含斜杠(/)则前面都会自动加上一个反斜杠()。

调查问题

发现问题之后首先去看了一下simple json的源代码,在他的源码中发现如下一段:

    public static void writeJSONString(Map map, Writer out) throws IOException {
        if(map == null){
            out.write("null");
            return;
        }

        boolean first = true;
        Iterator iter=map.entrySet().iterator();

        out.write(‘{‘);
        while(iter.hasNext()){
            if(first)
                first = false;
            else
                out.write(‘,‘);
            Map.Entry entry=(Map.Entry)iter.next();
            out.write(‘\"‘);
            out.write(escape(String.valueOf(entry.getKey())));
            out.write(‘\"‘);
            out.write(‘:‘);
            JSONValue.writeJSONString(entry.getValue(), out);
        }
        out.write(‘}‘);
    }

    public String toString(){
        return toJSONString();
    }

    /**
     * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters(U+0000 through U+001F).
     * It‘s the same as JSONValue.escape() only for compatibility here.
     *
     * @see org.json.simple.JSONValue#escape(String)
     *
     * @param s
     * @return
     */
    public static String escape(String s){
        return JSONValue.escape(s);
    }

从中可以知道,simple json在序列化的时候已经将string中的斜杠(还包含其他很多字符)转义了,在前面自动加上了反斜杠,问题根源找到。

解决方案

  1. 使用正则表达式替换一下simple json toString()之后的字符串,将不希望转义的字符恢复原型;
  2. 使用其他json库,比如org.json.JSONObject,这个库不会自动转义。

特别说明

其实国际规范中json中的key和value的字符串中包含的斜杠是需要转义的,只是转义之后在笔者的使用场景下会出错,特此说明。ECMA-404 json标准

时间: 2024-12-28 16:21:07

使用simple json时遇到的一个小问题的相关文章

写插件时遇到的一个小问题,关于animate和css3的问题

昨天写代码时,偶然想到了如果我们把css3属性放在animate中,指定时间.能否实现动画呢.举个例子吧: <script> $(".box").animate({ "-webkit-transform":"rotate(90deg)" },1000); </script> 如上代码,box会在一秒种从0deg旋转到90deg吗?答案是否定的. 于是我查了下jquery的手册,发现animate的第一参数中确实不能放css

python3实现多组输入时遇到的一个小问题

不加异常捕捉就会多输出一个空行 加上异常捕捉之后就会不多输出一个空行 比赛时还是要加上异常捕捉比较好 原文地址:https://www.cnblogs.com/wkqweizhi/p/12346770.html

X5 内核浏览器对json格式支持的一个小区别

var json1 = { "data": [{ "type": "pic", "filename": "P60107-124747.jpg", "data": {} }] }:和 var json2 = { data: [{ type: "pic", filename: "P60107-124747.jpg", data: {} }] }; 在大

设定CentOS的网络时碰到的一个小问题

安装了CentOS6.4,设定好网络之后,但是网络不好使. ethtool eth0报错' Settings for eth0: Cannot get device settings: No such device Cannot get wake-on-lan settings: No such device Cannot get message level: No such device Cannot get link status: No such device No data availa

VB.NET开发中遇到的一个小问题

在修改公司用vb.net的写的代码时,遇到一个小问题 页面上有一个button, ID是btnNext, 在属性页中,它的click事件对应的是cmdNext, 我像在c#中一样,在属性页中双击cmdNext,自动进入.vb后台代码,产生事件 Protected Sub cmdNext(sender As Object, e As System.EventArgs) Handles btnNext.Click //一些处理代码 End Sub 运行debug调试时,发现这个代码会执行两次,怎么都

一个小效果引出的兼容性探讨

最近在做个小效果,没想到引出了几个以前的没认真去自己探讨的兼容问题,最后虽然这个效果还是不是很满意,但在这里想分享一下过程 首先想做的效果是 每次点击页面时,出现一个小波纹,然后自动消失 可以先看一下demo 到最后实现后,发现这个效果实用性不是很高,但是过程引出了一些值得积累的问题 引出知识点: transition的兼容支持 事件兼容 transitionend的兼容 如果我out了,请点击关闭 首先看一下 transition 的兼容性 1 <span style="font-siz

BeX5开发中MySQL视图使用的一个小问题

问题 数据操作中的查询是极端重要的,使用频繁.MySQL数据库中视图概念的存在十分类似于微软Access小型关系数据库中的查询(二级考试重点).视图的存在极大减小了数据表的创建数量,而且还有更为高级的运用技巧.本文介绍在基于起步科技的BeX5平台上使用MySQL数据库中视图时反向生成本体时注意的一个小问题. MySQL数据库中表在BeX5平台开发中对应于"物理表"概念,但是为了增强软件开发中数据层的灵活性(软件需求阶段的实体结构不是一下百分之分确定的:有时需要不断调整),平台引入了本体

ajax返回json时,js获取类型,是字符串类型

ajax向php服务端请求,并返回json串给前端. js发现得到的返回值的类型是字符串,不能直接取json对象属性,需要JSON.parse(). 怎么解决呢? 这需要在php返回json时,加上一个header(),告知js,我这个返回的是Content-Type是json.这样js获取的就是json对象类型了. header('Content-Type: application/json; charset=utf-8'); 当返回的是字符串类型时,有可能Content-Type:text/

一个Json结构对比的Python小工具兼谈编程求解问题

先上代码. jsondiff.py #_*_encoding:utf-8_*_ import argparse import json import sys reload(sys) sys.setdefaultencoding('utf-8') def parseArgs(): description = 'This program is used to output the differences of keys of two json data.' parser = argparse.Arg