Flutter - 删除飞镖中的转义序列

Flutter - Remove escape sequence in dart

要将 API 响应字符串解码为 JSON,json.decode() 工作正常。
这将解析一个类似于

的 JSON 字符串
{ "Response" : {"Responsecode" : "1" , "Response" : "Success"}}

但就我而言,响应以序列化形式出现,例如:

{\"Response\" : {\"Responsecode\" : \"0\" , \"Response\" : \"Success\"}}

json.decode() 不行。

在Java中,我用StringEscapeUtils.unescapeJson()来解决同样的问题。
我搜索了 Dart,但找不到如何对字符串中的字符进行转义。

编辑:
假设,关键数据的值为abc"de
因此,其对应的 JSON 将是 {"data":"abc\"de"}
因此在序列化期间,这个 json 字符串被转义以给出 {\"data\":\"abc\\"de\"} 作为响应,它由 API.
发送 因此,我的目的是删除转义序列,以便我可以获得字符串 {"data":"abc\"de"},稍后将使用 json.decode() 对其进行解码。使用 java.

中的 StringEscapeUtils.unescapeJson() 删除转义序列

json.decode 也可以解码单个字符串,所以你应该可以只调用它两次。第一次它会 return 你一个字符串(转义字符已经被解码),第二次它会将该字符串解码到地图中:

import 'dart:convert';

void main() {
  var a = r'''"{\"Response\" : {\"Responsecode\" : \"0\" , \"Response\" : \"Success\"}}"''';
  var b = json.decode(json.decode(a));
  print(b['Response']['Responsecode']); // 0
  print(b['Response']['Response']); // Success
}

该示例工作正常。

JSON 回复是这样的

{
    "result": "successful",
    "data": {
        "id": 12,
        "name": "supported_countries",
        "value": "[{\"code\":\"BA\",\"name\":\"Bosnia & Herzegovina\",\"callingCodes\":[\"+387\"]},{\"code\":\"UG\",\"name\":\"Uganda\",\"callingCodes\":[\"+256\"]},{\"code\":\"CA\",\"name\":\"Canada\",\"callingCodes\":[\"+1\"]},{\"code\":\"AE\",\"name\":\"United Arab Emirates\",\"callingCodes\":[\"+971\"]},{\"code\":\"US\",\"name\":\"United States\",\"callingCodes\":[\"+1\"]},{\"code\":\"KE\",\"name\":\"Kenya\",\"callingCodes\":[\"+254\"]},{\"code\":\"GB\",\"name\":\"United Kingdom\",\"callingCodes\":[\"+44\"]}]",
        "secure": 0,
        "updated_at": "2018-10-13T14:20:05.000Z",
        "updated_by": null
    }
}

试着点赞

import 'dart:convert';

var content = r'''{"result": "successful",
    "data": {
        "id": 12,
        "name": "supported_countries",
        "value": "[{\"code\":\"BA\",\"name\":\"Bosnia & Herzegovina\",\"callingCodes\":[\"+387\"]},{\"code\":\"UG\",\"name\":\"Uganda\",\"callingCodes\":[\"+256\"]},{\"code\":\"CA\",\"name\":\"Canada\",\"callingCodes\":[\"+1\"]},{\"code\":\"AE\",\"name\":\"United Arab Emirates\",\"callingCodes\":[\"+971\"]},{\"code\":\"US\",\"name\":\"United States\",\"callingCodes\":[\"+1\"]},{\"code\":\"KE\",\"name\":\"Kenya\",\"callingCodes\":[\"+254\"]},{\"code\":\"GB\",\"name\":\"United Kingdom\",\"callingCodes\":[\"+44\"]}]",
        "secure": 0,
        "updated_at": "2018-10-13T14:20:05.000Z",
        "updated_by": null
    }
}''';

void main() {
  print(jsonDecode(content));
}

注意:如果您试图将该字符串放入 .dart 文件中,您将需要为其使用原始字符串(参见 https://dart.dev/guides/language/language-tour#strings)获得您想要的值,或者确保在转义引号之前转义斜杠。

有 r 前缀,使用 ",没有 r 前缀,使用 \" 作为转义 JSON 引号字符

r'\"' == '\\"'

有关更多更新,请参阅:https://groups.google.com/a/dartlang.org/g/misc/c/nXgGJFKzYhs