【问题标题】:json.loads not replacing apostrophejson.loads 不替换撇号
【发布时间】:2015-05-30 23:39:18
【问题描述】:

我有一个 json 对象,我正在加载并用双引号替换单引号。其语法为:

response = json.loads(response.text.replace("'", '"'))

在我的数据中,我有采用以下格式的键/值对:

"name":"John O'Shea"

这导致我得到以下回溯:

Traceback (most recent call last):
  File "C:\Python27\Whoscored\Test.py", line 204, in <module>
    response = json.loads(response.text.replace("'", '"').replace(',,', ','))
  File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting ',' delimiter: line 1 column 7751 (char 7750)

我实际上并不想替换上述名称中的撇号,但我原以为我的 json.loads 语句会将我的键/值对转换为:

"name":"John O"Shea"

我假设这也会失败。我需要知道的是:

1) 为什么我的 json.loads 语句在加载过​​程中没有替换字符串中的撇号? 2) 在我的字符串中转义撇号以使其不会导致错误但仍显示在负载中的最佳方法是什么?

我在较大的字符串上使用了一个 json 测试器,以确认没有其他错误会阻止对象正常工作,但实际上没有。

谢谢

【问题讨论】:

  • 为什么要替换撇号? "John O'Shea" 是一个包含John O'Shea 的完全有效的字符串。
  • 但是您正在调用repace,它正在替换它们,这就是您收到该错误的原因。我不明白你为什么要首先这样做,或者你期望发生什么。
  • 显示response.text[7745:7755]
  • 看看here

标签: python json


【解决方案1】:

如果您的 json 不包含特殊字符,最好将它们转换为 Unicode

private static String escapeNonAscii(String str) {

    StringBuilder retStr = new StringBuilder();
    for(int i=0; i<str.length(); i++) {
        int cp = Character.codePointAt(str, i);
        int charCount = Character.charCount(cp);
        if (charCount > 1) {
            i += charCount - 1; // 2.
            if (i >= str.length()) {
                throw new IllegalArgumentException("truncated unexpectedly");
            }
        }

        if (cp < 128) {
            retStr.appendCodePoint(cp);
        } else {
            retStr.append(String.format("\\u%x", cp));
        }
    }
    return retStr.toString();
}

【讨论】:

    【解决方案2】:

    Json 使用" 作为格式化字符,所以response.text.replace("'", '"') 只是破坏了文件。 Json 将字符串中的引号转义为 \" 所以这应该可以工作:

    response = json.loads(response.text.replace("'", '\\"'))
    

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多