Rest Template 无法正确解析 json rest api 响应

Posted

技术标签:

【中文标题】Rest Template 无法正确解析 json rest api 响应【英文标题】:Rest Template unable to parse json rest api response properly 【发布时间】:2018-02-23 15:16:04 【问题描述】:

我正在尝试使用 Spacy 的德语文本 NER 从文本中提取命名实体。我已将该服务公开为 REST POST 请求,该请求将源文本作为输入并返回命名实体(人、位置、组织)列表的字典(地图)。这些服务使用托管在 linux 服务器上的 Flask Restplus 公开。

考虑一个示例文本,我在通过 Swagger UI 公开的 REST API 上使用 POST 请求得到以下响应:


  "ner_locations": [
    "Deutschland",
    "Niederlanden"
  ],
  "ner_organizations": [
    "Miele & Cie. KG",
    "Bayer CropScience AG"
  ],
  "ner_persons": [
    "Sebastian Krause",
    "Alex Schröder"
  ]

当我使用 Spring 的 RestTemplate 从 Spring 引导应用程序(在 Eclipse 中的 Windows 操作系统上)在 Linux 服务器上托管的 API 上发布请求时。 json解析正确完成。我添加了以下行以使用 UTF-8 编码。

restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

但是当我在 linux 机器上部署这个 spring boot 应用程序并向 API 发送请求以进行 NER 标记时,ner_persons 未正确解析。远程调试时,我得到以下响应


  "ner_locations": [
    "Deutschland",
    "Niederlanden"
  ],
  "ner_organizations": [
    "Miele & Cie. KG",
    "Bayer CropScience AG"
  ],
  "ner_persons": [
    "Sebastian ",
    "Krause",
    "Alex ",
    "Schröder"
  ]

我无法理解为什么这种奇怪的行为会发生在个人而不是组织的情况下。

【问题讨论】:

【参考方案1】:

作为 python 新手,我花了 2 天的时间进行调试以了解真正的问题并找到解决方法。

原因是名称(例如,“Sebastian Krause”)由 \xa0 分隔,即不间断空格字符(例如,“Sebastian\xa0Krause”)而不是空格。因此 Spacy 未能将它们检测为单个 NamedEntity。

浏览 SO,我从here 找到了以下解决方案:

import unicodedata 
norm_text = unicodedata.normalize("NFKD", source_text)

这也规范了其他 unicode 字符,例如 \u2013\u2026 等。

【讨论】:

以上是关于Rest Template 无法正确解析 json rest api 响应的主要内容,如果未能解决你的问题,请参考以下文章

django rest api:JSON 解析错误 - 无法解码 JSON 对象

ReactJS:Rest API JSON 响应:如何解析

如何在C#中解析/反序列化从rest服务返回的JSON

使用 Rest Template 交换方法将 Json 映射到 POJO 类

WCF 服务 - 使用 json 调用客户端访问 rest 未提供正确的内容类型

C++ Qt 无法正确解析 JSON 数组