我在映射从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。”字符串
答案 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]