JSON 错误中出现意外的令牌,但我使用的是“produces = “text/plain””?

Posted

技术标签:

【中文标题】JSON 错误中出现意外的令牌,但我使用的是“produces = “text/plain””?【英文标题】:Unexpected Token in JSON error but I'm using 'produces = "text/plain"'? 【发布时间】:2021-10-02 21:35:59 【问题描述】:

当我在我的网络应用程序中调用以下函数时出现错误:

  getUML() 
    const testName = this.formdata.get('testName');
    this.disableDeployCTA = true;
    const params:string = testName + "/txt";
    const url = `http://localhost:8081/bruml/export/$params`
    this.httpService.generateUML(params).subscribe((response: any) => 
      this.umlText = response.data;
    );
  

请求通过 Spring Boot 应用程序,使用此方法:

@GetMapping(value = "/export/testName/txt", produces = "text/plain")
public ResponseEntity<String> exportTxt(@PathVariable("testName") String name) 
    UMLClient myClient = new UMLClient(); 
    String txtUML = "";
    byte[] toExport = null; 
    try 
        String fileName = ".\\tempFiles\\" + name;
        myClient.export(name, fileName + ".txt", true);
        
        File txtTemp = new File(fileName + ".txt");
        File file = new File(fileName + ".svg");
        Path filePath = Paths.get(fileName + ".txt");
        Charset charset = StandardCharsets.UTF_8;

        txtUML = new String(Files.readAllBytes(filePath)); 
        if(file.exists() && txtTemp.exists()) 
            file.delete();
            txtTemp.delete();
        
    
    catch (Exception e)
        e.printStackTrace();
    
    return new ResponseEntity<>(txtUML, HttpStatus.OK); 

generateUML方法如下:

  generateUML(params) 
    return this.httpClient.get('http://localhost:8081/bruml/export/'+ params);
  

我收到“JSON 中出现意外标记 @”的错误。但我不希望它解析为 JSON —— 我将产品属性设置为纯文本。我该如何解决这个问题?

编辑**

我在控制台中收到此错误

以下是开发工具中我的网络选项卡中有关请求和响应的详细信息:

【问题讨论】:

请您发布您的 json 你从哪里得到这个错误信息,前端还是后端? @Bharat @startuml autonumber ==step 1: ABS.API== "someImport"-&gt;"Web API Step 1": API #1 rnote left "someImport" static data 1 endrnote activate "Web API Step 1" "someImport" &lt;-- "Web API Step 1": [] deactivate "Web API Step 1" @enduml 虽然我想生成纯文本而不是 JSON 是的,那么后端正在正确地完成它的工作(仔细检查这一点,在邮递员中触发相同的事情并检查标题),前端似乎期待一个 JSON 对象,你可能不得不深入挖掘generateUML 方法 @Andreas,现在我们的 httpClient 对象有问题???? 【参考方案1】:

@anoncomp 您可以从浏览器网络选项卡中发布请求和响应吗?如果您收到200 响应,那么我们可以看到您从后端获得的确切信息。如果您得到正确的响应,那么问题将出现在这一行: this.umlText = response.data; 因为您期望响应是一个对象。 您可能需要解析响应。

编辑:你在使用 Angular 吗?如果是这样,您是否可以尝试在get 请求中发送选项,并将responseType 也作为text 发送?供参考:Angular Docs。默认情况下,Angular 将响应视为 JSON:

来自角度文档:

get() 调用需要以下选项:observe: 'body', responseType: 'json'

这些是这些选项的默认值,因此以下示例不传递选项对象。

【讨论】:

已发布!我收到了 200 响应,我还输入了我能找到的关于标题、响应等的所有细节。有趣的是,响应标题是纯文本。你会如何建议替换 this.umlText = response.data 只需使用 this.umlText = response; 得到了同样的错误:(我也试过response.data.toString和response.text() @anon comp 你在使用角度吗?如果是,您是否可以尝试在获取请求中发送带有响应类型文本的选项。供参考:angular.io/guide/http#requesting-data-from-a-server 默认情况下,Angular 将响应视为 JSON:来自 Angular 文档:要获取此类数据,get() 调用需要以下选项:observe: 'body', responseType: 'json'。这些是这些选项的默认值,因此以下示例不传递选项对象。

以上是关于JSON 错误中出现意外的令牌,但我使用的是“produces = “text/plain””?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 React.js 中读取 json,出现意外的令牌错误

如何解决错误:Asp.Net 请求中出现意外的令牌“<”?

Object.parse 处的 JSON 意外令牌

React Native - JSON中位置0的意外令牌U

如何解决语法错误、意外令牌、导出类型?

未捕获的语法错误:意外的令牌:getJSON