在.net 4中增加了对弱类型的支持。为和弱类型的对象进行数据交换提供了方法。我们常常会遇到将json字符串转成对象的情景,虽然可以使用

JavaScriptSerializer 或者 DataContractJsonSerializer

但是仍然需要些个对应的实体类,非常的麻烦。我在网上查资料,找到另外的实现方法:

使用:

string json = "[{\"name\":\"zhang3\"},{\"name\":\"zhang4\"}]";

var j = new JsonParser().FromJson(json);
//j是个 object[]
int len = j.Length;
var obj1 = j[];
var name = j[].name;

注意这里用到 dynamic 类型。在这里,弱类型的威力凸显出来了。

我们看看具体的实现类:

  /// <summary>
/// json转换
/// </summary>
public class JsonParser { /// <summary>
/// 从json字符串到对象。
/// </summary>
/// <param name="jsonStr"></param>
/// <returns></returns>
public dynamic FromJson(string jsonStr) {
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() }); dynamic glossaryEntry = jss.Deserialize(jsonStr, typeof(object)) as dynamic;
return glossaryEntry;
}
} public class DynamicJsonConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (dictionary == null)
throw new ArgumentNullException("dictionary"); if (type == typeof(object))
{
return new DynamicJsonObject(dictionary);
} return 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 Type[] { typeof(object) })); }
}
} public class DynamicJsonObject : DynamicObject
{
private IDictionary<string, object> Dictionary { get; set; } public DynamicJsonObject(IDictionary<string, object> dictionary)
{
this.Dictionary = dictionary;
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.Dictionary[binder.Name]; if (result is IDictionary<string, object>)
{
result = new DynamicJsonObject(result as IDictionary<string, object>);
}
else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
{
result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
}
else if (result is ArrayList)
{
result = new List<object>((result as ArrayList).ToArray());
} return this.Dictionary.ContainsKey(binder.Name);
}
}

参考:

http://www.codeproject.com/Articles/349646/Dynamic-JSON-parser

http://msdn.microsoft.com/zh-cn/library/dd264736.aspx

http://www.oschina.net/question/89964_45078

http://stackoverflow.com/questions/6201529/turn-c-sharp-object-into-a-json-string-in-net-4

.net 4中使用 dynamic,将json字符串转成对象的 万能方法。的更多相关文章

  1. json 字符串转换成对象,对象转换成json字符串

    json   字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法:   [注意jquery版本问题] var str = '{"name":&qu ...

  2. JSON字符串转换成对象时候 需要有默认构造器 因为这是通过反射创建的 反射是先通过默认构造器创建对象的

    JSON字符串转换成对象时候 需要有默认构造器 因为这是通过反射创建的 反射是先通过默认构造器创建对象的

  3. java操作JSON字符串转换成对象的时候如何可以不建立实体类也能获取数据

    引入依赖 <dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson& ...

  4. .NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr

    在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输.   .NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(t ...

  5. C#将json字符串解析成对象

    首先我们在客户端生成json字符串,通过ajax把该字符串传到服务器端   //这是一个以id,email,age的json字符串   var jdata="[{\"id\&quo ...

  6. json字符串转换成对象需要注意的问题

    json转换成对象的时候应该尽量避免出现特殊的符号,如“\”这样的字符在转义成数组的时候会被去除掉,最好的例子就是后台返回的内容为存储路径的JSON,这时候最好是把一个斜杠变为两个斜杠,如: [{&q ...

  7. C#中,JSON字符串转换成对象。

    在前台提交(post)的数据中.除了强类型的数据外,还有一个额外的json数据提交 在这里我的办法是,在前台把json对象转换成字符串,然后提交. 测试demo 前台: @using(Html.Beg ...

  8. 多层次的Json字符串转化为对象

    using Arvato.CRM.DataTrans.ConsoleHost.Model;using System;using System.Collections.Generic;using Sys ...

  9. Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...

随机推荐

  1. php实现rar文件的读取和解压

    PHP Rar Archiving 模块 (php_rar) 是一个读取和解压rar文件的模块,但不提供RAR压缩(打包)的功能. 1.首先要到PECL的RAR页面下载DLL. 根据自己的情况选择下载 ...

  2. 将Android Studio默认布局ConstraintLayout切换成LinearLayout

    将Android Studio默认布局ConstraintLayout切换成LinearLayout     大部分人初次使用google android 扁平化布局ConstraintLayout都 ...

  3. 微信小程序 weui 使用方法

      https://github.com/Tencent/weui-wxss/ 下载地址用于小程序的https://github.com/Tencent/weui   下载地址用于H5    运用示例 ...

  4. android check box 自定义图片

    http://blog.csdn.net/competerh_programing/article/details/7417074

  5. WPF使用System.Windows.SystemParameters类获得屏幕分辨率

    转自 http://hi.baidu.com/shirley_cst/item/a55c290c8aa2ee2ca0312da3 示例代码如下所示. double x = SystemParamete ...

  6. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。

    问题:HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 原因:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 ...

  7. Chrome中使用flash引起cpu飙升问题的处理

    本人使用的是Chrome 30 flash 18,在看视频或者登陆有调用flash插件的页面之后,经常会遇到Shockwave Flash插件CPU占用超过50%的情况(在Chrome的任务管理器可以 ...

  8. WebService 获取当前URL

    private string pageRoot = string.Empty; public virtual string PortalRoot { get { if (pageRoot == nul ...

  9. 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

    学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...

  10. PHP 常见header 状态

    转载:http://blog.csdn.net/mothz/article/details/6029810 <?php //200 正常状态 header('HTTP/1.1 200 OK'); ...