使用Newtonsoft反序列化JSON到.NET对象(或LINQ到JSON也许?)

我知道有一些关于牛顿软件的post,所以希望这不完全是一个重复…我试图将由Kazaa的API返回的JSON数据转换成一个很好的对象

WebClient client = new WebClient(); Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"); StreamReader reader = new StreamReader(stream); List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString()); foreach (string item in list) { Console.WriteLine(item); } //Console.WriteLine(reader.ReadLine()); stream.Close(); 

那JsonConvert线只是我正在尝试的最近的一个…我不是很明白,希望通过问你们来消除一些步法。 我最初试图将其转换成字典或其他东西…实际上,我只需要在那里抓住一些值,所以通过文档判断,也许Newtonsoft的LINQ to JSON可能是一个更好的select? 思考/链接?

以下是JSON返回数据的示例:

 { "page": 1, "total_pages": 8, "total_entries": 74, "q": "muse", "albums": [ { "name": "Muse", "permalink": "Muse", "cover_image_url": "http://image.kazaa.comhttp://img.dovov.com69/01672812 1569/Yaron_Herman_Trio/Muse/Yaron_Herman_Trio-Muse_1.jpg", "id": 93098, "artist_name": "Yaron Herman Trio" }, { "name": "Muse", "permalink": "Muse", "cover_image_url": "htt p://image.kazaa.comhttp://img.dovov.com54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg", "id": 102702, "artist_name": "\u76e7\u5de7\u97f3" }, { "name": "Absolution", "permalink": " Absolution", "cover_image_url": "http://image.kazaa.comhttp://img.dovov.com65/093624873365/Mus e/Absolution/Muse-Absolution_1.jpg", "id": 48896, "artist_name": "Muse" }, { "name": "Ab solution", "permalink": "Absolution-2", "cover_image_url": "http://image.kazaa.com/i mages/20/825646911820/Muse/Absolution/Muse-Absolution_1.jpg", "id": 118573, "artist _name": "Muse" }, { "name": "Black Holes And Revelations", "permalink": "Black-Holes-An d-Revelations", "cover_image_url": "http://image.kazaa.comhttp://img.dovov.com66/093624428466/ Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1.jpg", "id": 48813, "artist_name": "Muse" }, { "name": "Black Holes And Revelations", "permalink": "Bla ck-Holes-And-Revelations-2", "cover_image_url": "http://image.kazaa.comhttp://img.dovov.com86/ 825646911486/Muse/Black_Holes_And_Revelations/Muse-Black_Holes_And_Revelations_1 .jpg", "id": 118543, "artist_name": "Muse" }, { "name": "Origin Of Symmetry", "permalink": "Origin-Of-Symmetry", "cover_image_url": "http://image.kazaa.comhttp://img.dovov.com29/825646 912629/Muse/Origin_Of_Symmetry/Muse-Origin_Of_Symmetry_1.jpg", "id": 120491, "artis t_name": "Muse" }, { "name": "Showbiz", "permalink": "Showbiz", "cover_image_url": "http: //image.kazaa.comhttp://img.dovov.com68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg", "id": 60444, "artist_name": "Muse" }, { "name": "Showbiz", "permalink": "Showbiz-2", "cover_imag e_url": "http://image.kazaa.comhttp://img.dovov.com50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg", "id": 118545, "artist_name": "Muse" }, { "name": "The Resistance", "permalink": "T he-Resistance", "cover_image_url": "http://image.kazaa.comhttp://img.dovov.com36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg", "id": 121171, "artist_name": "Muse" } ], "per_page": 10 } 

我做了一些更多的阅读,发现Newtonsoft的LINQ to JSON正是我想要的…使用WebClient,Stream,StreamReader和Newtonsoft …我可以打到Kazaa的JSON数据,提取一个URL,下载文件,并做到这一点全部像七行代码! 我喜欢它。

 WebClient client = new WebClient(); Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"); StreamReader reader = new StreamReader(stream); Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine()); // Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]); stream.Close(); 

这个post得到了很多点击,我认为包括在评论中讨论的“使用”位可能是有帮助的。

 using(var client = new WebClient()) using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album")) using (var reader = new StreamReader(stream)) { var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine()); Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]); } 

如果你只是需要从JSON对象中获取一些项目,我会使用Json.NET的LINQ to JSON JObject类。 例如:

 JToken token = JObject.Parse(stringFullOfJson); int page = (int)token.SelectToken("page"); int totalPages = (int)token.SelectToken("total_pages"); 

我喜欢这种方法,因为您不需要完全反序列化JSON对象。 这可以方便地使用API​​,有时可能会让你感到惊讶,因为缺less对象属性,比如Twitter。

文档: 使用Json.NET 对JSON进行 序列化和反序列化JSON.NETLINQ to JSON

您可以使用C# dynamictypes来使事情更轻松。 这种技术也使重build更简单,因为它不依赖于魔术string。

JSON

下面的JSONstring是来自HTTP API调用的简单响应,它定义了两个属性: IdName

 {"Id": 1, "Name": "biofractal"} 

C

使用JsonConvert.DeserializeObject<dynamic>()将该string反序列化为一个dynamictypes,然后以通常的方式访问它的属性。

 dynamic results = JsonConvert.DeserializeObject<dynamic>(json); var id = results.Id; var name= results.Name; 

如果您将resultsvariables的types指定为dynamic ,而不是使用var关键字,那么属性值将正确反序列化,例如, Idint而不是JValue (感谢GFoley83的下面的评论)。

注意 :Newtonsoft程序集的NuGet链接是http://nuget.org/packages/newtonsoft.json

使用dynamic关键字,parsing这种types的对象变得非常简单:

 dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); var page = x.page; var total_pages = x.total_pages var albums = x.albums; foreach(var album in albums) { var albumName = album.name; // Access album data; } 

纠正我,如果我错了,但我相信,前面的例子,与最新版本的詹姆斯牛顿的Json.NET库略有不同步。

 var o = JObject.Parse(stringFullOfJson); var page = (int)o["page"]; var totalPages = (int)o["total_pages"]; 

反序列化并获取值(当集合是dynamic的时):

 // First serializing dynamic collection = new { stud = stud_datatable }; // The stud_datable is the list or data table string jsonString = JsonConvert.SerializeObject(collection); // Second Deserializing dynamic StudList = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); var stud = StudList.stud; foreach (var detail in stud) { var Address = detail["stud_address"]; // Access Address data; } 

另外,如果您只是寻找嵌套在JSON内容中的特定值,您可以这样做:

 yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName"); 

等等。

如果您不想承担将整个JSON转换为C#对象的成本,这可能会有所帮助。

我喜欢这个方法:

 using Newtonsoft.Json.Linq; // jsonString is your JSON-formatted string JObject jsonObj = JObject.Parse(jsonString); Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>(); 

你现在可以使用dictObj作为字典来访问任何你想要的东西。 你也可以使用Dictionary<string, string>如果你喜欢把值作为string。

您可以使用这个相同的方法来投射任何types的.NET对象。

如果像我一样,你更喜欢处理强types的对象**随着:

 MyObj obj = JsonConvert.DeserializeObject<MyObj>(jsonString); 

这样你就可以使用智能感知和编译时间types错误检查。

通过将JSON复制到内存中并将其粘贴为JSON对象(Visual Studio – >编辑 – >select性粘贴 – >将JSON粘贴为类),可以轻松地创build所需的对象。

如果您在Visual Studio中没有该选项,请参阅此处 。

你还需要确保你的JSON是有效的。 如果它只是一个对象数组,就在开始时添加自己的对象。 即{ “obj”: [{},{},{}]}

**我知道dynamic有时候会让事情变得更容易,但是我对此有点不满。