如何将儿童JSON结构转换为C#对象图



我正在使用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无论如何都会救助您。它可能始终被使用,以防止查询从"简单"到"复杂"并突然需要它的惊喜。

相关内容

  • 没有找到相关文章

最新更新