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
要将 API 响应字符串解码为 JSON,json.decode()
工作正常。
这将解析一个类似于
{ "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