无法正确映射 json 到数据模型

unable to correctly map json to data model

我想将以下信息建模到 json 但我做不到。

服务器使用以下模型向客户端发送操作结果

class Result (result:string, additional-info:string)

additional-info 可能包含 jsonstring,具体取决于用例。因此它的类型是String。当我需要在其中发送 json 时,我只需发送一个具有有效 json 语法的字符串,我想 Angular 客户端将能够将该字符串转换为 json 使用 JSON.parse.

我要发给客户端的json长这样

{
    "result": "success",
    "additional-info": {
        "list ": [{
            "tag": "sometag",
            "description": "some description"
        }]
    }
}

我检查了 jsonlint (https://jsonlint.com/) 结构是否正确。

在客户端(Angular),我是这样处理消息的:

  getQuestions(some args){
      console.log('response from server:',res)
      console.log('response body',res.body)
      let jsonResponse:ServerResponseAPI = res.body //should contain result and additional info
      console.log("result: "+jsonResponse.result+", additional info:"+jsonResponse.additionalInformation)
      let jsonList:string = jsonResponse.additionalInformation
      console.log("jsonQuestionList: "+jsonList)
      let information:Information = JSON.parse(jsonList)
      console.log("information:"+information)
    });
  }

ServerResponseAPI 定义为

export class ServerResponseAPI{ 
  constructor ( public result:string,
               public additionalInformation:string){}
}

当我执行代码时,我在浏览器的控制台上看到以下打印,但我看到 additional-info 未定义的错误。

response body {result: "success", additional-info: "{"list ": [{"tag": "sometag", "description": "some description"}]}"} list-management.service.ts:46 result: success, additional info:undefined

我可以看到正文包含 resultadditional-info 但是在将正文转换为 ServerResponseAPI 之后,我看到 resultsuccess 但是additional-info 未定义。

res.body中,javascript创建一个对象

{
    "result": "success",
    "additional-info": {
        "list ": [{
            "tag": "sometag",
            "description": "some description"
        }]
    }
}

该对象有两个键 - resultadditional-info。让我们称之为 Object1

我将它分配给一个具有键 resultadditionalInfo 的对象。请注意 additionalInfo 中命名约定的差异。在javascript中,变量名是区分大小写的,所以上面两个是不同的。让我们称之为 object2

现在 object1result 被分配给 object2result 因为键匹配(同名 resultadditional-info 成为 object2 中的新密钥 object2additionalInfo 键保持未定义,因为 object1 中没有键映射到 additionalInfo

为了解决这个问题,我必须创建一个 additional-info 密钥 ServerResponseAPI(或者我也可以将我的 JSON 属性 名称更改为 additionalInfo 但我不想改变它)。这是在 Angular 中完成的

export class ServerResponseAPI{
  'additional-info':string;
  constructor ( public result:string,
               public additionalInformation:string){
    this['additional-info'] = additionalInformation;
  }
}

在我的代码中,我现在访问密钥为

let jsonResponse:ServerResponseAPI = res.body //contains result and additional info
      console.log("result: "+jsonResponse.result+", additional info:"+jsonResponse['additional-info'])
      let jsonQuestionList:string = jsonResponse['additional-info']