将json字符串反序列化为结构会导致异常

时间:2019-03-06 15:12:24

标签: c# json serialization deserialization

我在映射从sql返回的json字符串时遇到问题。

对象的结构看起来像这样

  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字符串

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

生成json字符串的Sql

(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。”字符串

1 个答案:

答案 0 :(得分:1)

您的JSON字符串当前是PrescriptionInfo对象的列表,而不是包含PrescriptionInfo对象列表的OrderSummary对象。另外,某些字段(管理)被视为字符串,而不是对象。 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

我对SQL的JSON支持不强,可能会问这些标签,但似乎与此类似。

(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]