由于定java和delphi之间一个小的传输协议的问题,想利用JSON格式的字符串形式(字节流)进行数据封装。但突然想到字符转义的问题,在脑子里绕啊绕,结果把自己绕进去了,看了个电影,回头想,忽然豁然开朗,还是记在这里免得哪天又把自己绕进去了。
本身字符串遇到",',\还有几个控制字符都会进行转义。这些不需要我们额外考虑。所以如果我们所要传送的某项数据是字符串类型的话,例如:field项是字符串,实际内容是a"b\c,那么我们要传送的JSON格式的字符串应该是:{"field":"a\"b\\c"},这样完全正确。JSONObject的getString和get方法都能获得正确的结果。
而当时开始考虑转义问题的时候是写了几行测试代码,我是这样写的:
String str = "{field:'a\"b\\c'}";结果怎么也不是输出我们想要的结果。哈哈,其实是这样写,String首先解码一遍这个字符串,得到的实际内容是:{field:'a"b\c'},而这个字符串在传入JSONObject构造子过程中自然而然由JSONObject再翻译了一遍,JSONObject按照这个字符串应该是生成了这样的结构:{"field":"a\"bc"}(\由于转义失败而被忽略)。那么这样jsonObj.getString("field")回来的数据当然成了a"bc了。
呵呵,所以呢,其实在测试的那几行代码时,要是手写字符串而不是从别的途径获取的话,应该这样写了:String str = "{\"field\":\"a\\\"b\\\\c\"}" ,这样字符串的实际内容才是{"field":"a\*b\\c"},通过jsonObj.getString("field")也获得了预期的结果。
总之,把你的格式中的字符串的标志双引号作为起点,字符串中出现的特殊字符进行转义就可以了
本身字符串遇到",',\还有几个控制字符都会进行转义。这些不需要我们额外考虑。所以如果我们所要传送的某项数据是字符串类型的话,例如:field项是字符串,实际内容是a"b\c,那么我们要传送的JSON格式的字符串应该是:{"field":"a\"b\\c"},这样完全正确。JSONObject的getString和get方法都能获得正确的结果。
而当时开始考虑转义问题的时候是写了几行测试代码,我是这样写的:
String str = "{field:'a\"b\\c'}";结果怎么也不是输出我们想要的结果。哈哈,其实是这样写,String首先解码一遍这个字符串,得到的实际内容是:{field:'a"b\c'},而这个字符串在传入JSONObject构造子过程中自然而然由JSONObject再翻译了一遍,JSONObject按照这个字符串应该是生成了这样的结构:{"field":"a\"bc"}(\由于转义失败而被忽略)。那么这样jsonObj.getString("field")回来的数据当然成了a"bc了。
呵呵,所以呢,其实在测试的那几行代码时,要是手写字符串而不是从别的途径获取的话,应该这样写了:String str = "{\"field\":\"a\\\"b\\\\c\"}" ,这样字符串的实际内容才是{"field":"a\*b\\c"},通过jsonObj.getString("field")也获得了预期的结果。
总之,把你的格式中的字符串的标志双引号作为起点,字符串中出现的特殊字符进行转义就可以了