加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

[转]Json.net

发布时间:2020-12-16 19:31:12 所属栏目:百科 来源:网络整理
导读:JSON 应用愈发广泛,相对 XML 而言,JSON 格式的数据量更小,更利于传输和存储。在 Ajax、Data Service、Silverlight 等框架中都有大量应用。但 .NET Framework 对 JSON 的支持还很弱,由于无法使用动态类型,因此 JavaScriptSerializer().DeserializeObject(
JSON 应用愈发广泛,相对 XML 而言,JSON 格式的数据量更小,更利于传输和存储。在 Ajax、Data Service、Silverlight 等框架中都有大量应用。但 .NET Framework 对 JSON 的支持还很弱,由于无法使用动态类型,因此 JavaScriptSerializer().DeserializeObject() 只是简单地将 "未知类型" 的目标反序列化为一个泛型词典(Dictionary),看上去像个半成品。

CodePlex Json.NET 是另外一种选择,作者特意提供了一个 JsonConvert.DeserializeAnonymousType(),使得我们可以用一个匿名对象实例来指定反序列化类型。
var o = new
{
a = 1,
b = "Hello,World!",
c = new[] { 1,2,3 },
d = new Dictionary<string,int> { { "x",1 },{ "y",2 } }
};

var json = JsonConvert.SerializeObject(o);

var anonymous = new { a = 0,b = String.Empty,c = new int[0],d = new Dictionary<string,int>() };
var o2 = JsonConvert.DeserializeAnonymousType(json,anonymous);

Console.WriteLine(o2.b);
Console.WriteLine(o2.c[1]);

var o3 = JsonConvert.DeserializeAnonymousType(json,new { c = new int[0],int>() });

Console.WriteLine(o3.d["y"]);

DeserializeAnonymousType 只是借助这个匿名对象参数(anonymous) 反射类型而已,也就是说它和反序列化结果并非同一个对象。正如 o3 那样,我们也可以只提取局部信息。

实际上,我们也可以直接反序列化为 JObject,然后通过索引器直接访问。JObject、JProperty 等都继承自 JToken,它重载了基元类型转换操作符,我们可以直接得到实际结果。
var o = new
{
a = 1,2 } }
};

var json = JsonConvert.SerializeObject(o);

var o2 = JsonConvert.DeserializeObject(json) as JObject;

Console.WriteLine((int)o2["a"]);
Console.WriteLine((string)o2["b"]);
Console.WriteLine(o2["c"].Values().Count());
Console.WriteLine((int)o2["d"]["y"]);

Json.NET 同样支持强类型特性标注和反序列化,同时还提供了几个常用的格式转换器。
[JsonObject] class MyClass { [JsonProperty] public int a { get; set; } [JsonProperty] public string b { get; set; } [JsonProperty] public int[] c { get; set; } [JsonProperty] public Dictionary<string,int> d { get; set; } [JsonIgnore] public float e { get; set; } [JsonProperty] [JsonConverter(typeof(IsoDateTimeConverter))] public DateTime f { get; set; } } class Program { static void Main(string[] args) { var o = new MyClass { a = 1,b = "Hello,c = new[] { 1,2 } },f = DateTime.Now }; var json = JsonConvert.SerializeObject(o); var o2 = JsonConvert.DeserializeObject<MyClass>(json); } }
LINQ to JSON 看上去有点像 LINQ to XML,使用非常简单,有关详情可参考帮助文件。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读