【问题标题】:Sanitising a JSON String value in Java在 Java 中清理 JSON 字符串值
【发布时间】:2015-04-13 12:29:22
【问题描述】:

我需要接受来自用户的字符串并将其按原样放入 JSONObject。 documentation 表示字符串可以用 ' 引用,但显然我误解了。

这就足够了还是我错过了什么?

jsonObject.put("name", "'" + userInput + "'");

我单步执行了put 函数,但它似乎根本不关心字符串!有一个quote 函数,但它在字符串周围添加了另一组双引号,这似乎不正确。

【问题讨论】:

  • 为什么要把userInput 包裹在' 中?
  • json.org 文档说字符串需要用' 引用。
  • 请参考并引用该文档。

标签: java json escaping sanitization org.json


【解决方案1】:

您似乎引用了Javadoc的这一部分

字符串可以用 ' (单引号)引用。

前面是

toString 方法生成的文本严格符合 JSON 语法规则。 构造函数在文本中更宽容 他们会接受

JSON strings are wrapped in double quotes "。所以JSONObject#toString 将生成一个 JSON 值,其中 JSON 字符串在语法上是正确的。但是,JSONObject 构造函数可以接受 JSON 值(作为文本),其中 JSON 字符串用单引号而不是双引号括起来。

例如

JSONObject object = new JSONObject("{'bad':'json'}"); // not valid JSON
System.out.println(object);

产生有效的

{"bad":"json"}

put 方法在这里完全不相关。您不需要(也不应该)在指定的字符串周围使用单引号。


来自你的 cmets

JSONObject obj = new JSONObject();
obj.put("jsonStringValue","{\"hello\":\"world\"}");
obj.put("naturalStringValue", "\"hello world\"");
System.out.println(obj.toString());
System.out.println(obj.getString("jsonStringValue"));
System.out.println(obj.getString("naturalStringValue"));

打印

{"jsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"

【讨论】:

  • 但根据stackoverflow.com/questions/6155560/…,如果字符串是有效的 JSON,put 函数会将其嵌入为嵌套的 JSON 对象!那里的答案说用单引号括起来。
  • @Locutus 你想做什么? JSONObject#put 接受第二个参数并将其转换为适当的 JSON 值。如果是字符串,它会将其转换为 JSON 字符串(转义需要它的字符)。它是一个数字,它会将其转换为 JSON 数字。如果是数组,则为 JSON 数组。如果是对象,则为 JSON 对象。如果您尝试将 JSON 插入 JSON,请从 userInputput 创建一个 JSONObject
  • @Locutus 显然,如果您不知道 userInput 是否是 JSON 值,那么 JSONObject 确实提供了一种将其写入 JSON 原始文本的方法。如果userInput 不是有效的 JSON,它将破坏最终的 JSON 值。
  • 我想把它纯粹当作一个字符串。但在那个问题中,即使在为put 提供字符串(而不是 JSONObject)时,如果字符串恰好是有效的 JSON,它也会将字符串转换为嵌套的 JSONObject!查看他的示例代码,特别是jsonStringValue 部分。
  • @Locutus 他们必须要么使用旧(错误)版本的库,要么歪曲他们的结果。如果您使用JSONObject#put put 和 Java String,则 JSON 键值对的对应值将是一个 JSON 字符串,其中所有必要的字符都将被转义。例如,双引号 " 必须并且将被转义。
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
相关资源
最近更新 更多