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

时间:2018-10-12 07:35:56

标签: dart flutter unescapestring

要将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()完成的。

2 个答案:

答案 0 :(得分:3)

json.decode也可以解码单个字符串,因此您应该可以调用它两次。第一次它将返回一个字符串(其中的转义字符已被解码),而第二次它将返回该字符串到映射中:

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
}

答案 1 :(得分:0)

该示例工作正常。

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),以使其具有您所需要的值,或者确保在转义引号之前已经转义了斜杠。

对于带转义的JSON引号,请使用带有r前缀的“,不带r前缀使用\”

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

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