[C#.NET][LINQ] Linq to JSON for Json.NET

[C#.NET][LINQ] Linq to JSON for Json.NET

本文連結

明確定義 DTO class
動態物件

 


明確定義 DTO class

利用 Json.NET 所提供的『物件序列化』、『JSON字串反序列化』的相當的好用,效能也相當的快

序列化 JsonConvert.SerializeObject,可透過匿名型別,動態建立 json

反序列化 JsonConvert.DeserializeObject,需要明確定義 DTO class,才能正確的將 json text 轉換成物件,搭配 VS2013 的功能也能快速幫我們產生對應的 class,省去了敲打 class 的時間

http://www.dotblogs.com.tw/yc421206/archive/2014/03/05/144250.aspx

 

public class Person
{
    public string Name { get; set; }

    public int Age { get; set; }
}

 

JsonConvert.SerializeObject

image

 

JsonConvert.DeserializeObject

image


動態物件

Json.NET 提供了 JObject、JProperty、JArray  三個物件可讓我們不需要明確定義 DTO,即可動態操作 JSON DOM,再搭配 dynmic  使用起來可以更方便,我們來看一點例子,開始前需要準備一些工作:

1.準備 Json 資料

string json = @"
{
    'd':
    {
        'GetContextWebInformation':
        {
            '__metadata':
            {
                'type': 'SP.ContextWebInformation'
            },
            'FormDigestTimeoutSeconds': 1800,
            'FormDigestValue':
            '0xA9C12C0126187B262A1EC95EDC3B8FF18065791F0C52B505E1DF82F59529F6CDA00D8676C7B9A88F9252B12823D56F5259A9DEFA48EC0F16E824CD3190CCE776,13 Jun 2014 05:25:55 -0000',
            'LibraryVersion': '15.0.4569.1000',
            'SiteFullUrl': 'http://sps2013',
            'SupportedSchemaVersions':
            {
                '__metadata':
                {
                    'type': 'Collection(Edm.String)'
                },
                'results': [
                    '14.0.0.0',
                    '15.0.0.0'
                ]
            },
            'WebFullUrl': 'http://sps2013'
        }
    },
   'Persons':[
    {
        'Name': '余小章',
        'Age': 18
    },
    {
        'Name': 'jordan',
        'Age': 54
    }]
}
";

2.加入 Newtonsoft.Json.dll(from Nuget)

 

 


 

準備工作完成之後便可以開始進行開發

載入整個 DOM

JObject jsonObject = JObject.Parse(json);

階層順序節點操作

這必須依結點的節點一層一層的指定

取出余小章

image

 

程式碼

string name = (string)jsonObject["Persons"][1]["Name"];
Console.WriteLine(name);

 

取出 results[1]

image

 

程式碼
var result = jsonObject["d"]["GetContextWebInformation"]["SupportedSchemaVersions"]["results"][0];
Console.WriteLine(result);

 

取出集合

image

 

程式碼

var find = jsonObject["d"]["GetContextWebInformation"]["SupportedSchemaVersions"]["results"].Values<string>();
foreach (var item in find)
{
    Console.WriteLine(item);
}

 

使用 JArray

var find = (JArray)jsonObject["d"]["GetContextWebInformation"]["SupportedSchemaVersions"]["results"];
foreach (var item in find)
{
    Console.WriteLine(item.Value<string>());
}

 

使用 dynmic

這比上一個方法方便一些些,但仍需要瞭解整個 DOM 結構

var result = jsonObject.d.GetContextWebInformation.FormDigestValue;
Console.WriteLine(result);JObject jsonObject = JObject.Parse(json);

 

定點操作-使用 JProperty

這不需要瞭解整個 DOM 結構,只需要給予目標屬性就能取得結果,個人覺得這超好用

取出 FormDigestValue

image

 

var formDigestValue = jsonObject.Descendants().OfType<JProperty>().First(p => p.Name == "FormDigestValue").Value;
Console.WriteLine(formDigestValue);

 

取出 Age 集合的值

image

var ages = jsonObject.Descendants().OfType<JProperty>().Where(o => o.Name == "Age").Values().ToList();
foreach (var age in ages)
{
    Console.WriteLine(age);
}

本文出自:http://www.dotblogs.com.tw/yc421206/archive/2014/06/13/145543.aspx

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo