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

时间:2018-07-01 17:57:34

标签: javascript json angular6

我想将以下信息建模到public void resetDate(myDatePicker){ Calendar now = Calendar.getInstance(); this.myDatePicker.updateDate( now.get(now.YEAR), now.get(now.MONTH), now.get(now.DAY_OF_MONTH) ); } 中,但无法这样做。

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

json

class Result (result:string, additional-info:string) 可以包含additional-infojson,具体取决于用例。因此,其类型为string。当我需要在其中发送String时,我只发送了一个带有有效json语法的字符串,并且我想json客户端将能够将该字符串转换为{{ 1}}使用Angular

我要发送给客户端的json看起来像

JSON.parse

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

在客户端(json)上,我将消息发送如下:

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

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-inforesponse body {result: "success", additional-info: "{"list ": [{"tag": "sometag", "description": "some description"}]}"} list-management.service.ts:46 result: success, additional info:undefined,但是将主体投射到result之后,我看到additional-infoServerResponseAPI但{{ 1}}未定义。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

现在result中的object1被分配给result中的object2,因为键匹配(名称resultadditional-info成为object2中的新密钥 additionalInfo的{​​{1}}键保持未定义状态,因为object2中没有键映射到object1

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

additionalInfo

在我的代码中,我现在以以下方式访问键

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