Dart调用WordPress REST API返回JSON存在字符未转义问题如何解决?
这个问题在Dart端和WordPress服务端都可以修复,优先推荐Dart端处理,无需改动服务端配置,适配性更强。
方案1:Dart端处理(推荐)
你遇到的编码展示异常本质是WordPress REST API返回的rendered类字段默认会将特殊字符转换为HTML实体编码(比如”对应右双引号、—对应长破折号),你当前的代码仅做了UTF-8字节解码,没有对HTML实体做二次转义。
处理步骤:
- 在
pubspec.yaml中引入HTML实体转义包:
dependencies: html_unescape: ^2.0.0
- 拉取数据后对
rendered字段做转义处理,示例代码:
import 'package:http/http.dart' as http; import 'dart:convert'; import 'package:html_unescape/html_unescape.dart'; // 初始化转义实例,全局复用即可 final HtmlUnescape htmlUnescape = HtmlUnescape(); Future<List> fetchWpPosts() async { var url = Uri.parse('https://example.com/wp-json/wp/v2/posts'); // 注意:你原有请求头里的charset=UTF-16是错误配置,WordPress接口默认返回UTF-8编码,修正后可避免额外编码问题 final response = await http.get(url, headers: {'Accept': 'application/json; charset=UTF-8'}); var convertDatatoJson = jsonDecode(utf8.decode(response.bodyBytes)); // 可直接在这里批量处理所有内容的转义 for (var post in convertDatatoJson) { post['title']['rendered'] = htmlUnescape.convert(post['title']['rendered']); post['content']['rendered'] = htmlUnescape.convert(post['content']['rendered']); // 其他需要转义的字段同理处理 } return convertDatatoJson; }
方案2:WordPress服务端修改
如果希望接口直接返回未转义的字符,可以在WordPress主题的functions.php文件中添加钩子,过滤REST API的返回结果:
add_filter('rest_prepare_post', function($response, $post, $request) { $data = $response->get_data(); // 对标题、内容等字段做HTML实体解码 $data['title']['rendered'] = html_entity_decode($data['title']['rendered'], ENT_QUOTES | ENT_HTML5, 'UTF-8'); $data['content']['rendered'] = html_entity_decode($data['content']['rendered'], ENT_QUOTES | ENT_HTML5, 'UTF-8'); $response->set_data($data); return $response; }, 10, 3);
注意:该方案会修改接口的全局返回结果,如果有其他前端业务依赖原有HTML实体编码的格式,需要提前评估影响。
内容的提问来源于stack exchange,提问作者Martin Damyanov
相关产品推荐
相关产品推荐

