Десериализация строки json в структуру приводит к исключению - PullRequest
1 голос
/ 06 марта 2019

У меня проблемы с отображением строки json, возвращенной из sql.

Структура объекта выглядит следующим образом

  public class OrderSummaryDto
  {
        public List<PrescriptionInfo> PrescriptionsInfo { get; set; }

        public class PrescriptionInfo
        {
            public string Name { get; set; }
            public AdministrationInfo Administration { get; set; }

            public class AdministrationInfo
            {
                public string Instructions { get; set; }
                public string PackageType { get; set; }
            }
        }
   }

Строка json, возвращаемая из DB

[{"Name":"testName","Units":3,"Medium":"flower power","Administration":"{\"Instructions\":\"drIVnkLEm0b24OK9ceMeeF2fq\",\"PackageType\":\"case\"}"},{"Name":"testName","Units":3,"Medium":"flower power","Administration":"{\"Instructions\":\"drIVnkLEm0b24OK9ceMeeF2fq\",\"PackageType\":\"case\"}"}]

Sql, генерирующий строку json

(SELECT _co.[Name]  
       ,_co.[Pharmacy_Instructions] AS [Administration]
   FROM [dbo].[Compounds] _co
  WHERE _co.[Id] = 1
    FOR JSON PATH) AS [PrescriptionsInfo]     

Pharmacy_Instructions уже является строкой в ​​формате JSON

Сообщение "Не удалось привести или преобразовать из System.String в Models.Order.Summary.OrderSummaryDto + PrescriptionInfo + AdministrationInfo. "String

1 Ответ

1 голос
/ 06 марта 2019

Ваша строка JSON в настоящее время является списком объектов PrescriptionInfo, а не объектом OrderSummary, который содержит список объектов PrescriptionInfo. Кроме того, некоторые поля (Администрирование) обрабатываются как строки, а не объекты. Для правильной работы JSON должен выглядеть следующим образом:

{"PrescriptionsInfo": [{"Name":"testName","Units":3,"Medium":"flower power","Administration":{"Instructions":"drIVnkLEm0b24OK9ceMeeF2fq","PackageType":"case"}},{"Name":"testName","Units":3,"Medium":"flower power","Administration":{"Instructions":"drIVnkLEm0b24OK9ceMeeF2fq","PackageType":"case"}}]}

Или в формате:

{  
   "PrescriptionsInfo":[  
      {  
         "Name":"testName",
         "Units":3,
         "Medium":"flower power",
         "Administration":{  
            "Instructions":"drIVnkLEm0b24OK9ceMeeF2fq",
            "PackageType":"case"
         }
      },
      {  
         "Name":"testName",
         "Units":3,
         "Medium":"flower power",
         "Administration":{  
            "Instructions":"drIVnkLEm0b24OK9ceMeeF2fq",
            "PackageType":"case"
         }
      }
   ]
}

Для этого вам придется использовать псевдонимы. Проверьте это руководство MS https://docs.microsoft.com/en-us/sql/relational-databases/json/format-nested-json-output-with-path-mode-sql-server?view=sql-server-2017

Я слаб с поддержкой JSON в SQL, может спросить с этими тегами, но похоже, что это было бы что-то похожее на это.

(SELECT _co.[Name],  
       JSON_VALUE(_co.[Pharmacy_Instructions], '$.Instructions') AS "Administration.Instructions",
       JSON_VALUE(_co.[Pharmacy_Instructions], '$.PackageType') AS "Administration.PackageType"
   FROM [dbo].[Compounds] _co
  WHERE _co.[Id] = 1
    FOR JSON PATH) AS [PrescriptionsInfo] 
...