Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserializing JSON to .NET object using Newtonsoft (or LINQ to JSON maybe?)

I know there are a few posts about Newtonsoft so hopefully this isn't exactly a repeat...I'm trying to convert JSON data returned by Kazaa's API into a nice object of some kind

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(); 

That JsonConvert line is just the most recent one I was trying...I'm not quite getting it and was hoping to eliminate some footwork by asking you guys. I was originally trying to convert it into a Dictionary or something...and actually, I just need to snag a couple of values in there so judging by the documentation, maybe Newtonsoft's LINQ to JSON might be a better choice? Thoughts/Links?

Here is an example of the JSON return data:

{   "page": 1,   "total_pages": 8,   "total_entries": 74,   "q": "muse",   "albums": [     {       "name": "Muse",       "permalink": "Muse",       "cover_image_url": "http://image.kazaa.com/images/69/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.com/images/54/888880301154/Candy_Lo/Muse/Candy_Lo-Muse_1.jpg",       "i d": 102702,       "artist_name": "\u76e7\u5de7\u97f3"     },     {       "name": "Absolution",       "permalink": " Absolution",       "cover_image_url": "http://image.kazaa.com/images/65/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.com/images/66/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.com/images/86/ 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.com/images/29/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.com/images/68/825646182268/Muse/Showbiz/Muse-Showbiz_1.jpg",       "id": 60444,       "artist_name": "Muse"     },     {       "name": "Showbiz",       "permalink": "Showbiz-2",       "cover_imag e_url": "http://image.kazaa.com/images/50/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.com/images/36/825646864836/ Muse/The_Resistance/Muse-The_Resistance_1.jpg",       "id": 121171,       "artist_name": "Muse"     }   ],   "per_page": 10 } 

I did some more reading and found Newtonsoft's LINQ to JSON is exactly what I wanted...using WebClient, Stream, StreamReader, and Newtonsoft...I can hit Kazaa for JSON data, extract a URL, download the file, and do it all in like seven lines of code! I love it.

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(); 

This post gets so many hits I thought it might be helpful to include the "using" bits that are discussed in the comments.

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"]); } 
like image 648
J Benjamin Avatar asked Jan 20 '11 16:01

J Benjamin


People also ask

What is Newtonsoft JSON Linq?

The Newtonsoft. Json. Linq namespace provides classes that are used to implement LINQ to JSON. Classes. Class.

How do I deserialize a JSON object?

A common way to deserialize JSON is to first create a class with properties and fields that represent one or more of the JSON properties. Then, to deserialize from a string or a file, call the JsonSerializer. Deserialize method.

How do you serialize and deserialize an object in C# using JSON?

In Deserialization, it does the opposite of Serialization which means it converts JSON string to custom . Net object. In the following code, it calls the static method DeserializeObject() of the JsonConvert class by passing JSON data. It returns a custom object (BlogSites) from JSON data.

What is serializing and deserializing JSON?

JSON is a format that encodes objects in a string. Serialization means to convert an object into that string, and deserialization is its inverse operation (convert string -> object).


1 Answers

You can use the C# dynamic type to make things easier. This technique also makes re-factoring simpler as it does not rely on magic-strings.

JSON

The JSON string below is a simple response from an HTTP API call, and it defines two properties: Id and Name.

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

C#

Use JsonConvert.DeserializeObject<dynamic>() to deserialize this string into a dynamic type then simply access its properties in the usual way.

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

If you specify the type of the results variable as dynamic, instead of using the var keyword, then the property values will correctly deserialize, e.g. Id to an int and not a JValue (thanks to GFoley83 for the comment below).

Note: The NuGet link for the Newtonsoft assembly is http://nuget.org/packages/newtonsoft.json.

Package: You can also add the package with nuget live installer, with your project opened just do browse package and then just install it install, unistall, update, it will just be added to your project under Dependencies/NuGet

like image 167
biofractal Avatar answered Oct 07 '22 20:10

biofractal