Saya tahu ada beberapa posting tentang Newtonsoft jadi mudah-mudahan ini bukan pengulangan ... Saya mencoba mengubah data JSON yang dikembalikan oleh API Kazaa menjadi objek yang bagus.
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();
Garis JsonConvert itu adalah yang terbaru yang saya coba ... Saya tidak mengerti dan berharap untuk menghilangkan beberapa gerak kaki dengan bertanya pada kalian. Saya awalnya mencoba mengubahnya menjadi Kamus atau sesuatu ... dan sebenarnya, saya hanya perlu merobek beberapa nilai di sana sehingga menilai dari dokumentasi, mungkin LINQ ke JSON dari Newtonsoft mungkin merupakan pilihan yang lebih baik? Pikiran / Tautan?
Berikut adalah contoh data pengembalian 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
}
Saya melakukan beberapa bacaan lagi dan menemukan LINQ Newtonsoft ke JSON persis seperti yang saya inginkan ... menggunakan WebClient, Stream, StreamReader, dan Newtonsoft ... Saya dapat menekan Kazaa untuk data JSON, mengekstrak URL, mengunduh file, dan melakukannya semuanya seperti tujuh baris kode! Aku menyukainya.
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();
Posting ini mendapat begitu banyak hit saya pikir mungkin akan membantu untuk memasukkan bit "using" yang dibahas dalam komentar.
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"]);
}
WebClient
,Stream
danStreamReader
semua implementasinyaIDisposable
, Anda mungkin ingin menambahkan beberapausing
blok ke kode Anda.Jawaban:
Jika Anda hanya perlu mendapatkan beberapa item dari objek JSON, saya akan menggunakan LINQ Json.NET untuk
JObject
kelas JSON . Sebagai contoh:Saya suka pendekatan ini karena Anda tidak perlu sepenuhnya deserialize objek JSON. Ini berguna dengan API yang terkadang dapat mengejutkan Anda dengan properti objek yang hilang, seperti Twitter.
Dokumentasi: Melakukan Serialisasi dan Deserialisasi JSON dengan Json.NET dan LINQ ke JSON dengan Json.NET
sumber
Anda dapat menggunakan tipe C #
dynamic
untuk mempermudah. Teknik ini juga membuat re-factoring lebih sederhana karena tidak bergantung pada string sihir.JSON
String JSON di bawah ini adalah respons sederhana dari panggilan HTTP API, dan mendefinisikan dua properti:
Id
danName
.C #
Gunakan
JsonConvert.DeserializeObject<dynamic>()
untuk menghilangkan tanda dari string ini menjadi tipe dinamis lalu cukup mengakses propertinya dengan cara yang biasa.Jika Anda menentukan jenis
results
variabel sebagaidynamic
, alih-alih menggunakanvar
kata kunci, maka nilai properti akan deserialize dengan benar, misalnyaId
keint
dan bukanJValue
(terima kasih kepada GFoley83 untuk komentar di bawah).Catatan : Tautan NuGet untuk perakitan Newtonsoft adalah http://nuget.org/packages/newtonsoft.json .
Paket : Anda juga dapat menambahkan paket dengan installer langsung nuget, dengan proyek Anda dibuka lakukan browse paket lalu instal saja instal, unistall, perbarui , itu hanya akan ditambahkan ke proyek Anda di bawah Dependensi / NuGet
sumber
dynamic results = JsonConvert.DeserializeObject<ExpandoObject>(json);
sini FTW. Ini akan deserialize dengan benarId
ke int dan bukan aJValue
. Lihat di sini: dotnetfiddle.net/b0WxGJdynamic results = JsonConvert.DeserializeObject<dynamic>(json);
di VB.NET?Dim results As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(json)
tidak bekerja.Dengan
dynamic
kata kunci, menjadi sangat mudah untuk mem-parsing objek semacam ini:sumber
Perbaiki saya jika saya salah, tetapi contoh sebelumnya, saya percaya, hanya sedikit tidak sinkron dengan versi terbaru dari pustaka Json.NET James Newton.
sumber
JObject
, tetapi kode yang saya modifikasi untuk jawaban saya ditarik dari penggunaan kode kelebihanSelectToken
metode sehingga saya bisa menekan pengecualian jika token tidak ditemukanJToken JToken.SelectToken(string tokenName, bool errorWhenNoMatch)
:, jadi dari situlah verbositas itu berasal.Jika, seperti saya, Anda lebih suka berurusan dengan objek yang sangat diketik ** pergi dengan:
Dengan cara ini Anda bisa menggunakan intellisense dan mengkompilasi pengecekan tipe waktu.
Anda dapat dengan mudah membuat objek yang diperlukan dengan menyalin JSON Anda ke dalam memori dan menempelkannya sebagai objek JSON (Visual Studio -> Edit -> Paste Special -> Tempel JSON sebagai Kelas).
Lihat di sini jika Anda tidak memiliki opsi itu di Visual Studio.
Anda juga perlu memastikan JSON Anda valid. Tambahkan objek Anda sendiri di awal jika hanya berupa array objek. yaitu { "obj": [{}, {}, {}]}
** Saya tahu dinamika kadang-kadang membuat segalanya lebih mudah, tetapi saya agak bodoh dengan ini.
sumber
Daftar Dinamis Longgar Diketik - Deserialize dan baca nilainya
sumber
Saya suka metode ini:
Sekarang Anda dapat mengakses apa pun yang Anda inginkan menggunakan
dictObj
kamus. Anda juga dapat menggunakanDictionary<string, string>
jika Anda lebih suka mendapatkan nilai sebagai string.Anda bisa menggunakan metode yang sama ini untuk melakukan cast seperti segala jenis objek .NET.
sumber
Juga, jika Anda hanya mencari nilai tertentu yang bersarang di dalam konten JSON, Anda dapat melakukan sesuatu seperti:
Dan seterusnya dari sana.
Ini bisa membantu jika Anda tidak ingin menanggung biaya konversi seluruh JSON menjadi objek C #.
sumber
saya mengidam Extionclass for json:
Desain-pola:
Pemakaian:
sumber
Agak terlambat ke pesta ini, tetapi saya menemukan sendiri masalah ini hari ini di tempat kerja. Inilah cara saya memecahkan masalah.
Saya sedang mengakses API pihak ke-3 untuk mengambil daftar buku. Objek mengembalikan objek JSON besar yang berisi sekitar 20 bidang, yang saya hanya membutuhkan ID sebagai objek string Daftar. Saya menggunakan linq pada objek dinamis untuk mengambil bidang spesifik yang saya butuhkan dan kemudian memasukkannya ke objek string Daftar saya.
sumber
Akhirnya Dapatkan Nama Negara Dari JSON
Terima kasih!
sumber