如何parsing没有JSON.NET库的JSON?
我试图在Visual Studio 2011上为Windows 8构build一个Metro应用程序。当我试图做到这一点时,我遇到了一些关于如何parsingJSON
而不使用JSON.NET
库的问题(它不支持地铁应用程序呢)。
无论如何,我想parsing这个:
{ "name":"Prince Charming", "artist":"Metallica", "genre":"Rock and Metal", "album":"Reload", "album_image":"http:\/\/up203.siz.co.il\/up2\/u2zzzw4mjayz.png", "link":"http:\/\/f2h.co.il\/7779182246886" }
您可以使用.NET 4.5中添加的System.Json命名空间中的类。
JsonValue.Parse()方法分析JSON文本并返回一个JsonValue :
JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");
如果你传递一个JSON对象的string,你应该可以把这个值转换成一个JsonObject :
JsonObject result = value as JsonObject; Console.WriteLine("Name .... {0}", (string)result["name"]); Console.WriteLine("Artist .. {0}", (string)result["artist"]); Console.WriteLine("Genre ... {0}", (string)result["genre"]); Console.WriteLine("Album ... {0}", (string)result["album"]);
这些类与System.Xml.Linq命名空间中的类非常相似。
我使用这个…但是从来没有做过任何地铁应用程序开发,所以我不知道任何限制你可用的图书馆。 (注意,你需要用DataContract和DataMember属性来标记你的类)
public static class JSONSerializer<TType> where TType : class { /// <summary> /// Serializes an object to JSON /// </summary> public static string Serialize(TType instance) { var serializer = new DataContractJsonSerializer(typeof(TType)); using (var stream = new MemoryStream()) { serializer.WriteObject(stream, instance); return Encoding.Default.GetString(stream.ToArray()); } } /// <summary> /// DeSerializes an object from JSON /// </summary> public static TType DeSerialize(string json) { using (var stream = new MemoryStream(Encoding.Default.GetBytes(json))) { var serializer = new DataContractJsonSerializer(typeof(TType)); return serializer.ReadObject(stream) as TType; } } }
所以,如果你有这样的一个class级…
[DataContract] public class MusicInfo { [DataMember] public string Name { get; set; } [DataMember] public string Artist { get; set; } [DataMember] public string Genre { get; set; } [DataMember] public string Album { get; set; } [DataMember] public string AlbumImage { get; set; } [DataMember] public string Link { get; set; } }
那么你会这样使用它…
var musicInfo = new MusicInfo { Name = "Prince Charming", Artist = "Metallica", Genre = "Rock and Metal", Album = "Reload", AlbumImage = "http://up203.siz.co.il/up2/u2zzzw4mjayz.png", Link = "http://f2h.co.il/7779182246886" }; // This will produce a JSON String var serialized = JSONSerializer<MusicInfo>.Serialize(musicInfo); // This will produce a copy of the instance you created earlier var deserialized = JSONSerializer<MusicInfo>.DeSerialize(serialized);
你有没有尝试过使用JavaScriptSerializer
? 还有DataContractJsonSerializer
对于那些没有4.5,这是我的库函数读取JSON。 它需要对System.Web.Extensions
的项目引用。
using System.Web.Script.Serialization; public object DeserializeJson<T>(string Json) { JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer(); return JavaScriptSerializer.Deserialize<T>(Json); }
通常,json是基于合同写出来的。 该合同通常可以编入一个类( T
)中。 有时你可以从json中抽出一个词,然后search对象浏览器来查找该types。
用法示例:
鉴于json
{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
你可以像这样parsing成RadComboBoxClientState
对象:
string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState"); RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson); return RadComboBoxClientState.Value;
你可以使用DataContractJsonSerializer
。 看到这个链接了解更多细节。
我已经发布了一个名为Tiferix.Json的.NET库,它允许您将Json文件序列化并从ADO.Net DataSet和DataTable对象中反序列化。 这个项目是一个正在进行的工作,在未来6个月(希望),我将扩大function,允许各种types的.Net类和对象,包括dynamic类和匿名types的序列化。 截至目前,Tiferix.Json库没有原始的JsonDataReader,但是它有一个相当强大的JsonDataWriter类,它可以使用.NET二进制或StreamWriter的相同types的方式编写Json文件。 Tiferix.Json库的JsonDataWriter也可以自动识别你的Json文件,这是一个非常有用的function,我在其他任何Json库(包括Json.Net)中都没有见过。
如果您有兴趣,可以在我的Github页面上查看Tiferix.Json项目并下载库和dll。 Tiferix.Json提供了一个更简单,更轻量级的替代更全面的Json.Net库,也不那么僵化,更容易使用(在我看来)比原生.Net Json类。
Tiferix Json图书馆