c#将json转换为dynamic对象 (推荐)
来源:互联网 发布:java最新商城源码 编辑:程序博客网 时间:2024/06/05 21:12
来自:http://outofmemory.cn/code-snippet/1246/c-jiang-json-switch-dynamic-object
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;private sealed class DynamicJsonConverter : JavaScriptConverter{ public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { if (dictionary == null) throw new ArgumentNullException("dictionary"); return type == typeof(object) ? new DynamicJsonObject(dictionary) : null; } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { throw new NotImplementedException(); } public override IEnumerable<Type> SupportedTypes { get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); } } #region Nested type: DynamicJsonObject private sealed class DynamicJsonObject : DynamicObject { private readonly IDictionary<string, object> _dictionary; public DynamicJsonObject(IDictionary<string, object> 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<string, object>) { new DynamicJsonObject((IDictionary<string, object>)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<string, object>) new DynamicJsonObject((IDictionary<string, object>)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; } var dictionary = result as IDictionary<string, object>; if (dictionary != null) { result = new DynamicJsonObject(dictionary); return true; } var arrayList = result as ArrayList; if (arrayList != null && arrayList.Count > 0) { if (arrayList[0] is IDictionary<string, object>) result = new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x))); else result = new List<object>(arrayList.Cast<object>()); } return true; } } #endregion}
用法如下:
string json = ...;var serializer = new JavaScriptSerializer();serializer.RegisterConverters(new[] { new DynamicJsonConverter() });dynamic obj = serializer.Deserialize(json, typeof(object));
例如给定的字符串如下:
{ "Items":[ { "Name":"Apple", "Price":12.3 }, { "Name":"Grape", "Price":3.21 } ], "Date":"21/11/2010"}执行结果:
var data = serializer.Deserialize(json, 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)
- c#将json转换为dynamic对象 (推荐)
- c#将json转换为dynamic对象
- C#将对象转换为xml或json格式
- 将其他对象转换为JSON对象
- 将对象转换为json对象
- JSON.parse()方法将数据转换为javascript对象
- 将.Net对象转换为Json字符串
- 将java对象转换为Json
- json2html:将JSON对象转换为HTML
- JS 将JSON对象转换为字符串
- 将json对象转换为字符串
- 将JSON字符串转换为String对象
- 将json转换为java集合对象
- android将对象转换为json格式
- 将对象转换为json字符串
- 如何将bean转换为json对象
- ObjectMapper 将其他对象转换为json
- JS 将JSON对象转换为字符串
- HEVC/H265 解码图表,请对照代码看。
- NDIS IM调试遇到的问题:OID_TCP_TASK_OFFLOAD
- sublime text 2 插件收集
- 为Oracle数据库表创建自动增长序列及Oracle的常见操作
- iPhone 文件结构和文件操作
- c#将json转换为dynamic对象 (推荐)
- NHibernate
- 时间格式化最全的类,拷进工程就可使用
- 树莓派上手实战之配置Samba服务器(修正版)(转)
- Java NIO框架Mina、Netty、Grizzly介绍与对比
- C++ 实现栈
- 面向连接例子
- Java允许跨域重载
- android-ocr 光学字符识别技术