博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#将json转换为dynamic对象 (推荐)
阅读量:2287 次
发布时间:2019-05-09

本文共 3514 字,大约阅读时间需要 11 分钟。

来自: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
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) })); } } #region Nested type: DynamicJsonObject 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; } var dictionary = result as IDictionary
; 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
) result = new List
(arrayList.Cast
>().Select(x => new DynamicJsonObject(x))); else result = new List
(arrayList.Cast()); } 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)

转载地址:http://trunb.baihongyu.com/

你可能感兴趣的文章
postgres 从修改行返回数据
查看>>
postgres 查询命令详解
查看>>
postgres 索引
查看>>
postgres 并发控制
查看>>
postgres 性能优化小技巧
查看>>
Bash 脚本基本语法
查看>>
linux 用户和组管理命令
查看>>
X509 证书详解
查看>>
nginx 概念和基本功能
查看>>
nignx SSL 管理详解
查看>>
Google 搜索常用命令和小技巧
查看>>
python 详解
查看>>
搜索引擎学习总结
查看>>
Java动态代理
查看>>
AOP helloworld by Annotation
查看>>
AOP helloworld by XML
查看>>
Spring配置数据源
查看>>
Spring 的声明式事务管理概述
查看>>
java练习 计算n位可被浮点数精确表示的小数
查看>>
输出最长子串 Java实现
查看>>