Я знаю, что есть несколько сообщений о Newtonsoft, так что, надеюсь, это не совсем повторение ... Я пытаюсь преобразовать данные JSON, возвращаемые API Kazaa, в какой-то хороший объект
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 является самой последней из тех, что я пробовал ... Я не совсем понял, и надеялся избавиться от лишних усилий, спрашивая вас, ребята. Первоначально я пытался преобразовать его в словарь или что-то в этом роде ... и на самом деле мне просто нужно поймать там несколько значений, поэтому, судя по документации, может быть, LINTON to JSON от Newtonsoft может быть лучшим выбором? Мысли / ссылки?
Вот пример возвращаемых данных 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
}
Я еще немного прочитал и обнаружил, что LINQ to JSON от Newtonsoft - это именно то, что мне нужно ... используя 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"]);
}
WebClient
,Stream
иStreamReader
все реализоватьIDisposable
, вы можете захотеть добавить некоторыеusing
блоки кода.Ответы:
Если вам просто нужно получить несколько элементов из объекта JSON, я бы использовал класс LINQ to JSON в Json.NET
JObject
. Например:Мне нравится этот подход, потому что вам не нужно полностью десериализовать объект JSON. Это очень удобно для API, которые иногда могут удивить вас отсутствующими свойствами объекта, такими как Twitter.
Документация: Сериализация и десериализация JSON с Json.NET и LINQ to JSON с Json.NET
источник
Вы можете использовать C #
dynamic
тип чтобы упростить задачу. Этот метод также упрощает ре-факторинг, поскольку он не зависит от магических струн.JSON
Строка JSON ниже представляет собой простой ответ от вызова HTTP API и определяет два свойства:
Id
иName
.C #
Используйте
JsonConvert.DeserializeObject<dynamic>()
для десериализации этой строки в динамический тип, а затем просто получите доступ к ее свойствам обычным способом.Если вы укажете тип
results
переменной какdynamic
вместоvar
ключевого слова, то значения свойств будут правильно десериализованы, например,Id
в a,int
а не aJValue
(спасибо GFoley83 за комментарий ниже).Примечание . Ссылка NuGet для сборки Newtonsoft: http://nuget.org/packages/newtonsoft.json .
Пакет : Вы также можете добавить пакет с помощью Nuget Live Installer, когда ваш проект открыт, просто просмотрите пакет, а затем просто установите его, установите, удалите, обновите , он будет просто добавлен в ваш проект в разделе Зависимости / NuGet.
источник
dynamic results = JsonConvert.DeserializeObject<ExpandoObject>(json);
здесь FTW. Это будет правильно десериализоватьId
в int, а не aJValue
. Смотрите здесь: dotnetfiddle.net/b0WxGJdynamic results = JsonConvert.DeserializeObject<dynamic>(json);
в VB.NET?Dim results As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Object)(json)
не работает.С помощью
dynamic
ключевого слова становится действительно легко разобрать любой объект такого типа:источник
Поправьте меня, если я ошибаюсь, но предыдущий пример, я считаю, немного не синхронизирован с последней версией библиотеки Json.NET Джеймса Ньютона.
источник
JObject
, но код, который я изменил для своего ответа, был взят из кода, использующего перегрузкуSelectToken
метода, чтобы я мог подавлять исключения, если токен не был нашелJToken JToken.SelectToken(string tokenName, bool errorWhenNoMatch)
, так вот откуда пришло многословие.Если, как и я, вы предпочитаете иметь дело со строго типизированными объектами **, используйте:
Таким образом, вы можете использовать intellisense и проверку ошибок типа времени компиляции.
Вы можете легко создать необходимые объекты, скопировав свой JSON в память и вставив его как объекты JSON (Visual Studio -> Правка -> Специальная вставка -> Вставить JSON как классы).
Посмотрите здесь, если у вас нет этой опции в Visual Studio.
Вам также необходимо убедиться, что ваш JSON действителен. Добавьте свой собственный объект в начале, если это просто массив объектов. то есть { "obj": [{}, {}, {}]}
** Я знаю, что динамика иногда делает вещи проще, но я немного староват с этим.
источник
Динамический список Loosely Typed - десериализовать и прочитать значения
источник
Мне нравится этот метод:
Теперь вы можете получить доступ ко всему, что вы хотите, используя в
dictObj
качестве словаря. Вы также можете использовать,Dictionary<string, string>
если вы предпочитаете получать значения в виде строк.Вы можете использовать этот же метод для приведения в качестве любого вида объекта .NET.
источник
Кроме того, если вы просто ищете конкретное значение, вложенное в контент JSON, вы можете сделать что-то вроде этого:
И так далее.
Это может помочь, если вы не хотите нести расходы на преобразование всего JSON в объект C #.
источник
я создал Extionclass для JSON:
Дизайн-шаблон:
Использование:
источник
Довольно поздно на эту вечеринку, но сегодня я столкнулся с этим вопросом на работе. Вот как я решил проблему.
Я получал доступ к стороннему API для получения списка книг. Объект возвратил массивный объект JSON, содержащий примерно 20+ полей, из которых мне нужен только идентификатор в качестве строкового объекта списка. Я использовал linq для динамического объекта, чтобы получить нужное поле, а затем вставил его в мой строковый объект списка.
источник
Наконец получить имя состояния из JSON
Спасибо!
источник