J B*_*min 310 c# linq json json.net deserialization
我知道有一些关于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();
Run Code Online (Sandbox Code Playgroud)
那个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",
"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
}
Run Code Online (Sandbox Code Playgroud)
我做了一些阅读,发现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();
Run Code Online (Sandbox Code Playgroud)
这篇文章获得了如此多的点击量,我认为包含评论中讨论的"使用"位可能会有所帮助.
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"]);
}
Run Code Online (Sandbox Code Playgroud)
bio*_*tal 265
您可以使用C#dynamic
类型来简化操作.这种技术也使得重新分解更简单,因为它不依赖于魔术字符串.
JSON
下面的JSON字符串是来自HTTP API调用的简单响应,它定义了两个属性:Id
和Name
.
{"Id": 1, "Name": "biofractal"}
Run Code Online (Sandbox Code Playgroud)
C#
用于JsonConvert.DeserializeObject<dynamic>()
将此字符串反序列化为动态类型,然后以通常的方式访问其属性.
dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;
Run Code Online (Sandbox Code Playgroud)
如果您指定results
变量的类型dynamic
,而不是使用var
关键字,那么属性值将正确反序列化,例如Id
,int
而不是a JValue
(感谢GFoley83以获取下面的注释).
注意:Newtonsoft程序集的NuGet链接是http://nuget.org/packages/newtonsoft.json.
arc*_*ain 253
如果你只需要从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");
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法,因为您不需要完全反序列化JSON对象.这对于API来说非常方便,它们有时会让您感到惊讶,因为它缺少对象属性,比如Twitter.
文档:序列化和反序列化JSON与Json.NET和LINQ到JSON与Json.NET
Sus*_*ava 37
使用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;
}
Run Code Online (Sandbox Code Playgroud)
小智 21
如果我弄错了,请纠正我,但我相信,之前的例子与最新版本的James Newton的Json.NET库略有不同步.
var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];
Run Code Online (Sandbox Code Playgroud)
Guy*_*owe 15
如果像我一样,你更愿意处理强类型对象**请使用:
MyObj obj = JsonConvert.DeserializeObject<MyObj>(jsonString);
Run Code Online (Sandbox Code Playgroud)
这样你就可以使用intellisense和编译时间类型错误检查.
您可以通过将JSON复制到内存中并将其粘贴为JSON对象(Visual Studio - >编辑 - >选择性粘贴 - >将JSON粘贴为类)来轻松创建所需对象.
如果在Visual Studio中没有该选项,请在此处查看.
您还需要确保您的JSON有效.如果它只是一个对象数组,则在开始时添加您自己的对象.即{ "obj": [{},{},{}]}
**我知道动态有时会使事情变得容易,但我对此有点傻笑.
Aru*_*E S 10
反序列化并获取值(当集合是动态的时):
// 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;
}
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法:
using Newtonsoft.Json.Linq;
// jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();
Run Code Online (Sandbox Code Playgroud)
您现在可以使用dictObj
字典作为任何内容访问.Dictionary<string, string>
如果您希望将值作为字符串获取,也可以使用.
您可以使用相同的方法来转换为任何类型的.NET对象.
此外,如果您只是在寻找嵌套在JSON内容中的特定值,您可以执行以下操作:
yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");
Run Code Online (Sandbox Code Playgroud)
等等.
如果您不想承担将整个JSON转换为C#对象的成本,这可能会有所帮助.
归档时间: |
|
查看次数: |
645390 次 |
最近记录: |