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

我知道有一些关于Newtonsoft的帖子,所以希望这不是一次重复……我试图将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到JSON可能是一个更好的选择?想法/链接?

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

{
"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
}

我做了更多的阅读,发现Newtonsoft的LINQ到JSON正是我想要的…使用WebClient,流,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();

这篇文章点击率很高,我认为在评论中加入“使用”的部分可能会有所帮助。

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"]);
}
726363 次浏览

如果你只需要从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(如Twitter)来说非常方便。

文档:使用JSON序列化和反序列化JSON。< /净强有力的>LINQ to JSON with JSON。< /净强有力的>

如果我说错了,请纠正我,但我认为前面的例子与James Newton的Json的最新版本略有不同步。网络图书馆。

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

你可以使用c# dynamic类型使事情变得更简单。这种技术也使得重构更简单,因为它不依赖于魔法字符串。

JSON

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

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

c#

使用JsonConvert.DeserializeObject<dynamic>()将此字符串反序列化为动态类型,然后以通常的方式访问其属性。

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

如果你指定results变量的类型为dynamic,而不是使用var关键字,那么属性值将正确地反序列化,例如Idint而不是JValue(感谢GFoley83下面的注释)。

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

:你也可以添加nuget live安装包,当你的项目打开时,只需要执行浏览包,然后安装安装,卸载,更新,它就会被添加到你的项目的Dependencies/ nuget下

使用dynamic关键字,解析任何此类对象变得非常容易:

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内容中寻找一个嵌套的特定值,你可以这样做:

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

以此类推。

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

动态列表松散类型-反序列化并读取值

// 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 = JsonConvert.DeserializeObject(jsonString);


var stud = StudList.stud;
foreach (var detail in stud)
{
var Address = detail["stud_address"]; // Access Address data;
}

我喜欢这个方法:

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>

您可以使用相同的方法将其转换为任何类型的. net对象。

如果像我一样,你更喜欢处理强类型对象**请使用:

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

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

您可以通过将JSON复制到内存中并将其粘贴为JSON对象轻松创建所需的对象(Visual Studio -> Edit -> Paste Special -> Paste JSON as Classes)。

如果在Visual Studio中没有这个选项,请参阅在这里

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

**我知道动态有时使事情更容易,但我有点ol'skool与此。

最后从JSON中获取州名

谢谢!

Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.collections.generic


Public Module Module1
Public Sub Main()


Dim url As String = "http://maps.google.com/maps/api/geocode/json&address=attur+salem&sensor=false"
Dim request As WebRequest = WebRequest.Create(url)
dim response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
dim reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
Dim dataString As String = reader.ReadToEnd()


Dim getResponse As JObject = JObject.Parse(dataString)


Dim dictObj As Dictionary(Of String, Object) = getResponse.ToObject(Of Dictionary(Of String, Object))()
'Get State Name
Console.WriteLine(CStr(dictObj("results")(0)("address_components")(2)("long_name")))
End Sub
End Module

我为json创建了一个Extionclass:

 public static class JsonExtentions
{
public static string SerializeToJson(this object SourceObject) { return Newtonsoft.Json.JsonConvert.SerializeObject(SourceObject); }




public static T JsonToObject<T>(this string JsonString) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject<T>(JsonString); }
}

设计模式:

 public class Myobject
{
public Myobject(){}
public string prop1 { get; set; }


public static Myobject  GetObject(string JsonString){return  JsonExtentions.JsonToObject<Myobject>(JsonString);}
public  string ToJson(string JsonString){return JsonExtentions.SerializeToJson(this);}
}

用法:

   Myobject dd= Myobject.GetObject(jsonstring);


Console.WriteLine(dd.prop1);

虽然很晚了,但我今天在工作中遇到了这个问题。下面是我解决这个问题的方法。

我正在访问第三方API来检索图书列表。该对象返回一个包含大约20多个字段的大型JSON对象,其中我只需要ID作为List字符串对象。我在动态对象上使用linq检索我需要的特定字段,然后将其插入到我的List字符串对象中。

dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();


List<string> codes = new List<string>();


foreach (var code in contentCodes)
{
codes.Add(code?.ToString());
}

使用JsonConvert.DeserializeObject()函数进行反序列化

public class ApiValues
{
[JsonProperty("Address")]
public string Address { get; set; }


[JsonProperty("BaseUrl")]
public string BaseUrl{ get; set; }
}


var json =
{
"Address":"some-address",
"BaseUrl":"some-url-value"
}




var values = JsonConvert.DeserializeObject<ApiValues>(json);