我正在使用sql Server 2016的JSON将SQL Server选择语句转换为JSON字符串。我的目的是将C#转换为对象的JSON字符串。
SQL Server选择语句:
SELECT
Id AS PersonId,
FirstName,
LastName,
Name,
Birthday,
(
SELECT
PhoneNumber.PhoneNumberTypeId,
PhoneNumber.PhoneNumber
FROM
PhoneNumber
INNER JOIN PhoneNumberType ON PhoneNumber.PhoneNumberTypeId = PhoneNumberType.Id
WHERE
PhoneNumber.PersonId = Person.Id
FOR JSON PATH,INCLUDE_NULL_VALUES
) AS PhoneNumberList
FROM
Person
ORDER BY
LastName
FOR JSON PATH,INCLUDE_NULL_VALUES
C#我试图将数据转换为:
public class PersonDataContract : IPersonDataContract
{
public Int32 PersonId { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String Name { get; set; }
public DateTime? Birthday { get; set; }
public Int32 Age { get; }
public IList<IPhoneNumberDataContract> PhoneNumberList { get; set; }
public PersonDataContract()
{
PhoneNumberList = new List<IPhoneNumberDataContract>();
}
}
RAW JSON:
[
{
"PersonId": 5,
"FirstName": "Squire",
"LastName": "Escrow",
"Name": "Squire Escrow",
"Birthday": "2001-12-12",
"PhoneNumberList": "[{"PhoneNumberTypeId":1,"PhoneNumber":"8129091423"}]"
},
{
"PersonId": 6,
"FirstName": "Vilhelm",
"LastName": "Huldsputh",
"Name": "Vilhelm Huldsputh",
"Birthday": "1953-11-13",
"PhoneNumberList": "[{"PhoneNumberTypeId":1,"PhoneNumber":"9871237171"},{"PhoneNumberTypeId":2,"PhoneNumber":"8189991212"}]"
}
]
代码将RAW JSON转换为对象:
...
using (DbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
var jsonString = reader.GetValue(0).ToString();
var list = JsonConvert.DeserializeObject<List<PersonDataContract>>(jsonString);
}
reader.Close();
}
只要我从RAW JSON中删除Phonenumberlist,就可以使用此过程。我认为问题是我在我的SQL语句中使用2'为JSON PATH的使用(一个用于Phonenumberlist本身,一个用于整体选择语句),这导致Phonenumberlist被转换为未被转换为一个的字符串阵列。
如何将代表电话号码集合的子字符串转换为iphonenumberdatacontract的阵列?
这是常见问题中涵盖的:
问题。我在表列中存储了JSON文本。我想将其包括在
FOR JSON
的输出中。但是FOR JSON
逃脱了 JSON中的字符,所以我得到了一个JSON字符串,而不是 嵌套对象[..]答案。 json存储在文本列或文字中的文字中。也就是说,它被双引号包围并逃脱。如果 您想返回一个未示例的JSON对象,将JSON列作为
JSON_QUERY
函数的参数[..]
没有明确地提到任何使用FOR JSON
的非平凡子查询也会产生逃逸值,并以这种方式需要JSON_QUERY
。所以使用
SELECT
Id AS PersonId,
FirstName,
LastName,
Name,
Birthday,
JSON_QUERY(
SELECT
...
FOR JSON PATH,INCLUDE_NULL_VALUES
) AS PhoneNumberList
由"非平凡",我的意思是这样的查询确实不是需要 JSON_QUERY
:
SELECT
'Foo' AS Foo, (
SELECT 1 AS A
FOR JSON PATH
) AS Bar
FOR JSON PATH
Bar
不会在这里逃脱,因为优化器显然记得它与JSON打交道。我还没有能够找到一套一致的规则来控制此(不同的问题,同一问题),甚至还不清楚这是意图的行为还是错误,但是JSON_QUERY
无论如何都会救助您。它可能始终被使用,以防止查询从"简单"到"复杂"并突然需要它的惊喜。