首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Newtonsoft将JSON反序列化为.NET对象(或者LINQ?)

使用Newtonsoft将JSON反序列化为.NET对象(或者LINQ?)
EN

Stack Overflow用户
提问于 2011-01-20 16:19:51
回答 12查看 726.2K关注 0票数 336

我知道有几篇关于Newtonsoft的文章,所以希望这不是重复.我正在尝试把Kazaa的API返回的JSON数据转换成一个不错的对象

代码语言:javascript
运行
复制
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线是我最近尝试过的.我不太明白,我希望通过询问你们来消除一些步法。我最初试图把它转换成字典或something...and --实际上,我只需要在其中捕获几个值,所以从文档来看,也许Newtonsoft的LINQ可能是一个更好的选择?想法/链接?

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

代码语言:javascript
运行
复制
{
  "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的lines正是我的wanted...using WebClient、Stream、StreamReader和Newtonsoft.我可以点击Kazaa获取JSON数据,提取一个URL,下载文件,然后用七行代码完成这一切!我爱死它了。

代码语言:javascript
运行
复制
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();

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

代码语言:javascript
运行
复制
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"]);
}
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-01-20 16:29:28

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

代码语言:javascript
运行
复制
JToken token = JObject.Parse(stringFullOfJson);

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

我喜欢这种方法,因为您不需要完全反序列化JSON对象。这在API中很有用,这些API有时会让您惊讶于缺少的对象属性,比如Twitter。

文档:用Json.NET序列化和反序列化JSON用Json.NET从LINQ到JSON

票数 275
EN

Stack Overflow用户

发布于 2012-05-23 10:30:29

您可以使用C# dynamic类型来简化工作。这种技术还使重构变得更简单,因为它不依赖于神奇的字符串。

JSON

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

代码语言:javascript
运行
复制
{"Id": 1, "Name": "biofractal"}

C#

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

代码语言:javascript
运行
复制
dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;

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

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

软件包:您还可以使用nuget添加包,打开项目只需执行浏览包,然后只需安装安装,统一,更新,就可以将其添加到Dependencies/NuGet下的项目中。

票数 282
EN

Stack Overflow用户

发布于 2014-08-28 06:54:55

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

代码语言:javascript
运行
复制
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;
}
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4749639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档