开发手册 欢迎您!
软件开发者资料库

.NET(C#) Json字符串反序列化成dynamic类型对象的方法代码

本文主要介绍.NET(C#)中,将Json字符串反序列化(Deserialize)时,反序列化(Deserialize)成动态类型(dynamic类型)对象的五种方法和代码。

1、使用Json.NET实现

文档https://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;

//using Newtonsoft.Json.Linqdynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");string name = stuff.Name;string address = stuff.Address.City;

2、使用System.Web.Helpers.Json实现

文档System.Web.Helpers.Json

包含在System.Web.Helpers程序集(.NET 4.0)中。

var dynamicObject = Json.Decode("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;

3、使用JavaScriptSerializer实现

.Net 4.0内置的一个库

using System.Web.Script.Serialization;
JavaScriptSerializer jss = new JavaScriptSerializer();
var d = jss.Deserialize(str);

using System.Web.Script.Serialization;
WebClient client = new WebClient();
string getString = client.DownloadString("https://graph.facebook.com/zuck");
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize(getString);
string name = item["name"];

4、使用JsonFx实现

文档https://github.com/jsonfx/jsonfx

var reader = new JsonReader(); var writer = new JsonWriter();string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";dynamic output = reader.Read(input);Console.WriteLine(output.array[0]); // 42string json = writer.Write(output);Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}

5、使用自定义DynamicJsonConverter类实现

需要引用System.Web.Extensions

DynamicJsonConverter类代码

using System;using System.Collections;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Dynamic;using System.Linq;using System.Text;using System.Web.Script.Serialization;public sealed class DynamicJsonConverter : JavaScriptConverter{    public override object Deserialize(IDictionary dictionary, Type type, JavaScriptSerializer serializer)    {        if (dictionary == null)            throw new ArgumentNullException("dictionary");        return type == typeof(object) ? new DynamicJsonObject(dictionary) : null;    }    public override IDictionary Serialize(object obj, JavaScriptSerializer serializer)    {        throw new NotImplementedException();    }    public override IEnumerable SupportedTypes    {        get { return new ReadOnlyCollection(new List(new[] { typeof(object) })); }    }    private sealed class DynamicJsonObject : DynamicObject    {        private readonly IDictionary _dictionary;        public DynamicJsonObject(IDictionary dictionary)        {            if (dictionary == null)                throw new ArgumentNullException("dictionary");            _dictionary = dictionary;        }        public override string ToString()        {            var sb = new StringBuilder("{");            ToString(sb);            return sb.ToString();        }        private void ToString(StringBuilder sb)        {            var firstInDictionary = true;            foreach (var pair in _dictionary)            {                if (!firstInDictionary)                    sb.Append(",");                firstInDictionary = false;                var value = pair.Value;                var name = pair.Key;                if (value is string)                {                    sb.AppendFormat("{0}:\"{1}\"", name, value);                }                else if (value is IDictionary)                {                    new DynamicJsonObject((IDictionary)value).ToString(sb);                }                else if (value is ArrayList)                {                    sb.Append(name + ":[");                    var firstInArray = true;                    foreach (var arrayValue in (ArrayList)value)                    {                        if (!firstInArray)                            sb.Append(",");                        firstInArray = false;                        if (arrayValue is IDictionary)                            new DynamicJsonObject((IDictionary)arrayValue).ToString(sb);                        else if (arrayValue is string)                            sb.AppendFormat("\"{0}\"", arrayValue);                        else                            sb.AppendFormat("{0}", arrayValue);                    }                    sb.Append("]");                }                else                {                    sb.AppendFormat("{0}:{1}", name, value);                }            }            sb.Append("}");        }        public override bool TryGetMember(GetMemberBinder binder, out object result)        {            if (!_dictionary.TryGetValue(binder.Name, out result))            {                // return null to avoid exception.  caller can check for null this way...                result = null;                return true;            }            result = WrapResultObject(result);            return true;        }        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)        {            if (indexes.Length == 1 && indexes[0] != null)            {                if (!_dictionary.TryGetValue(indexes[0].ToString(), out result))                {                    // return null to avoid exception.  caller can check for null this way...                    result = null;                    return true;                }                result = WrapResultObject(result);                return true;            }            return base.TryGetIndex(binder, indexes, out result);        }        private static object WrapResultObject(object result)        {            var dictionary = result as IDictionary;            if (dictionary != null)                return new DynamicJsonObject(dictionary);            var arrayList = result as ArrayList;            if (arrayList != null && arrayList.Count > 0)            {                return arrayList[0] is IDictionary                     ? new List(arrayList.Cast>().Select(x => new DynamicJsonObject(x)))                     : new List(arrayList.Cast());            }            return result;        }    }}

使用示例代码

dynamic data = serializer.Deserialize("{ \"Items\":[ { \"Name\":\"Apple\", \"Price\":12.3 }, { \"Name\":\"Grape\", \"Price\":3.21 } ], \"Date\":\"21/11/2010\" }", typeof(object));data.Date; // "21/11/2010"data.Items.Count; // 2data.Items[0].Name; // "Apple"data.Items[0].Price; // 12.3 (as a decimal)data.Items[1].Name; // "Grape"data.Items[1].Price; // 3.21 (as a decimal)

2009-2024 Copyright Wonhero.Com All Rights Reserved
深圳幻海软件技术有限公司 版权所有