使用dynamic簡化Json.NET JObject操作

不知是RSS ATOM錯亂還是怎麼的,feedly RSS閱讀器冒出一篇Rick Strahl 2012的老文章 Using JSON.NET for dynamic JSON parsing ,讓我大吃一驚,發現自己一直用JProperty的笨拙方法處理動態JSON物件,其實結合dynamic就能大幅簡化。莫名其妙讀到兩年多前的文章,是老天爺的安排吧?擔心不順從天意會遭天譴,特筆記分享之。XD

以下範例示範使用強型別物件、JObject+JProperty、JObject+dymanic三種不同做法,處理JSON反序列化及序列化。

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace JsonNetLab
{
    class Program
    {
        static void Main(string[] args)
        {
            lab1();
            lab2();
            lab3();
            lab4();
            lab5();
            lab6();
            Console.Read();
        }
        static string jsonSrc = 
@"{ 
    ""d"": ""2015-01-01T00:00:00Z"", 
    ""n"": 32767, 
    ""s"": ""darkthread"",
    ""a"": [ 1,2,3,4,5 ]
}";
 
 
        public class foo
        {
            public DateTime d { get; set; }
            public int n { get; set; }
            public string s { get; set; }
            public int[] a { get; set; }
        }
 
        //反序列化 方法1 定義強型別物件接收資料
        static void lab1()
        {
            foo f = JsonConvert.DeserializeObject<foo>(jsonSrc);
            Console.WriteLine("d:{0},n:{1},s:{2},a:{3}", f.d, f.n, f.s, 
                string.Join("/", f.a));
 
        }
        //反序列化 方法2 使用JObject、JProperty、JArray、JToken物件
        static void lab2()
        {
            JObject jo = JObject.Parse(jsonSrc);
            DateTime d = jo.Property("d").Value.Value<DateTime>();
            int n = jo["n"].Value<int>();
            string s = jo["s"].Value<string>();
            int[] ary = jo["a"].Value<JArray>()
                               .Select(o => o.Value<int>()).ToArray();
            Console.WriteLine("d:{0},n:{1},s:{2},a:{3}", d, n, s, 
                string.Join("/", ary));
        }
        //反序列化 方法3 使用dynamic
        static void lab3()
        {
            JObject jo = JObject.Parse(jsonSrc);
            dynamic dyna = jo as dynamic;
            var ary = ((JArray)jo["a"]).Cast<dynamic>().ToArray();
            Console.WriteLine("d:{0},n:{1},s:{2},a:{3}", dyna.d, dyna.n, dyna.s,
                string.Join("/", ary));
        }
 
        //序列化 方法1 使用強型別
        static void lab4()
        {
            foo f = new foo()
            {
                d = new DateTime(2015, 1, 1),
                n = 32767,
                s = "darkthread",
                a = new int[] { 1, 2, 3, 4, 5 }
            };
            Console.WriteLine("JSON:{0}", JsonConvert.SerializeObject(f));
        }
 
        //序列化 方法2 使用JObject、JPorperty、JArray
        static void lab5()
        {
            JObject jo = new JObject();
            jo.Add(new JProperty("d", new DateTime(2015, 1, 1)));
            jo.Add(new JProperty("n", 32767));
            jo.Add(new JProperty("s", "darkthread"));
            jo.Add(new JProperty("a", new JArray(1, 2, 3, 4, 5)));
            Console.WriteLine("JSON:{0}", jo.ToString(Formatting.None));
        }
        //序列化 方法3 使用dynamic
        static void lab6()
        {
            dynamic dyna = new JObject();
            dyna.d = new DateTime(2015, 1, 1);
            dyna.n = 32767;
            dyna.s = "darkthread";
            dyna.a = new JArray(1, 2, 3, 4, 5);
            Console.WriteLine("JSON:{0}", dyna.ToString(Formatting.None));
        }
 
    }
}

相較之下,使用dynamic動態型別,效果與使用JProperty存取相同,但程式碼簡潔許多,未來在.NET 4+環境就決定用它囉~

歡迎推文分享:
Published 10 February 2015 09:02 PM 由 Jeffrey
Filed under:
Views: 15,028



意見

# Fish said on 10 February, 2015 09:24 AM

方法1和2標記似乎重覆了?

# Jeffrey said on 10 February, 2015 07:15 PM

to Fish, 嘿,猶豫不決要編方法1-6還是序列化跟反序列化各編方法1-3,結果一團亂。謝謝提醒,已重新整理。

# wellxion said on 11 February, 2015 09:10 PM

好奇問問...

效能差距如何呢:D?

# edr said on 13 July, 2017 05:00 AM

有用

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<February 2015>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication