微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Newtonsoft 将 JSON 反序列化为 .NET 对象或者可能是 LINQ to JSON?

如何解决使用 Newtonsoft 将 JSON 反序列化为 .NET 对象或者可能是 LINQ to JSON?

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

JToken token = JObject.Parse(stringFullOfJson);

int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");

我喜欢这种方法,因为您不需要完全反序列化 JSON 对象。这在 API 中派上用场,这些 API 有时会因缺少对象属性而让您感到惊讶,例如 Twitter。

文档:

解决方法

我知道有一些关于 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 to 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","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,"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,{
      "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,"permalink": "Showbiz-2","cover_imag e_url": "http://image.kazaa.com/images/50/825646912650/Muse/Showbiz/Muse-Showbiz_ 1.jpg","id": 118545,{
      "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 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();

这篇文章获得了如此多的点击,我认为包含评论中讨论的“使用”位可能会有所帮助。

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"]);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。