невозможно правильно сопоставить JSON с моделью данных - PullRequest
0 голосов
/ 01 июля 2018

Я хочу смоделировать следующую информацию в json, но не могу этого сделать.

Сервер отправляет результат операции клиенту, используя следующую модель

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

additional-info может содержать json или string в зависимости от варианта использования. Таким образом, его тип 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

Я вижу, что тело содержит result и additional-info, но после преобразования тела в ServerResponseAPI я вижу, что result равно success, но additional-info не определено.

1 Ответ

0 голосов
/ 02 июля 2018

in res.body, javascript создает объект

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

Объект имеет две клавиши - result и additional-info. Давайте назовем это Object1

Я назначаю его объекту с ключами result и additionalInfo. Обратите внимание на разницу в именовании в additionalInfo. В javascript имена переменных чувствительны к регистру, поэтому вышеупомянутые две разные. Позволяет назвать это object2

Теперь result с object1 назначается на result с object2, поскольку ключи совпадают (то же имя result) additional-info становится новым ключом в object2 additionalInfo ключ object2 остается неопределенным, так как без ключа из 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...