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

20 浏览
0 Comments

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

我知道有一些关于Newtonsoft的帖子,希望这不是重复的...我正试图将Kazaa的API返回的JSON数据转换为一个不错的对象。

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

那个JsonConvert行只是我最近尝试的...我还没有完全理解它,希望通过询问你们来消除一些工作。我最初是尝试将它转换成一个Dictionary或其他什么东西...实际上,我只需要在其中获取一些值,所以根据文档来看,可能Newtonsoft的LINQ to JSON可能是更好的选择?思考/链接?

这是一个JSON返回数据的例子:

{
  "page": 1,
  "total_pages": 8,
  "total_entries": 74,
  "q": "muse",
  "albums": [
    {
      "name": "Muse",
      "permalink": "Muse",
      "cover_image_url": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https: //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": "https://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": "https://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("https://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("https://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"]);
}

admin 更改状态以发布 2023年5月21日
0
0 Comments

如果你只需要从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.NET序列化和反序列化JSON使用Json.NET的LINQ to JSON

0
0 Comments

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

JSON

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

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

C#

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

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

如果将results变量的类型指定为dynamic,而不是使用var关键字,则属性值将正确反序列化,例如将Id反序列化为int而不是JValue(感谢GFoley83在下面的评论中提供的信息)。

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

安装程序包:你也可以使用NuGet实时安装程序包,在打开项目时,只需浏览程序包,然后只需安装它安装、卸载、更新,它将被添加到你的项目的“Dependencies/NuGet”下。

0