330

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();

その 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
}

さらに読んだところ、Newtonsoft の LINQ to JSON がまさに私が望んでいたものであることがわかりました...WebClient、Stream、StreamReader、および Newtonsoft を使用して...Kazaa で JSON データを取得し、URL を抽出し、ファイルをダウンロードして実行できます。全部で 7 行のコードです。大好きです。

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"]);
}
4

12 に答える 12

279

C#dynamic型を使用すると、作業が簡単になります。この手法は、魔法の文字列に依存しないため、リファクタリングも簡単になります。

JSON

以下の JSON 文字列は、HTTP API 呼び出しからの単純な応答であり、2 つのプロパティを定義しています:IdName.

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

C#

JsonConvert.DeserializeObject<dynamic>()この文字列を動的な型に逆シリアル化し、通常の方法でそのプロパティにアクセスするために使用します。

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

キーワードを使用する代わりに、results変数の型を as として指定すると、プロパティ値は、たとえばa ではなくanに正しく逆シリアル化されます (以下のコメントについては GFoley83 に感謝します)。dynamicvarIdintJValue

: Newtonsoft アセンブリの NuGet リンクはhttp://nuget.org/packages/newtonsoft.jsonです。

パッケージ: nuget ライブ インストーラーを使用してパッケージを追加することもできます。プロジェクトを開いた状態で、パッケージを参照し、インストール、アンインストール、更新するだけで、Dependencies/NuGet の下のプロジェクトに追加されます。

于 2012-05-23T10:30:29.530 に答える
273

JSONオブジェクトからいくつかのアイテムを取得する必要がある場合は、Json.NETのLINQtoJSONJObjectクラスを使用します。例えば:

JToken token = JObject.Parse(stringFullOfJson);

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

JSONオブジェクトを完全に逆シリアル化する必要がないため、このアプローチが好きです。これは、Twitterなどのオブジェクトプロパティが欠落していることに驚かされることがあるAPIで役立ちます。

ドキュメント: Json.NETを使用したJSONのシリアル化と逆シリアル化およびJson.NET使用したLINQからJSONへの逆シリアル化

于 2011-01-20T16:29:28.720 に答える
45

キーワードを使用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;
}
于 2014-08-28T06:54:55.833 に答える
22

間違っている場合は訂正してください。ただし、前の例は、James Newton の Json.NET ライブラリの最新バージョンとわずかに同期していないと思います。

var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];
于 2011-01-20T17:54:54.673 に答える
12

緩く型付けされた動的リスト- 値を逆シリアル化して読み取る

// 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;
}
于 2015-11-04T05:45:07.050 に答える
0

最後に JSON から州名を取得する

ありがとうございました!

Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.collections.generic

Public Module Module1
    Public Sub Main()

         Dim url As String = "http://maps.google.com/maps/api/geocode/json&address=attur+salem&sensor=false"
            Dim request As WebRequest = WebRequest.Create(url)
        dim response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
        dim reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
          Dim dataString As String = reader.ReadToEnd()

        Dim getResponse As JObject = JObject.Parse(dataString)

        Dim dictObj As Dictionary(Of String, Object) = getResponse.ToObject(Of Dictionary(Of String, Object))()
        'Get State Name
        Console.WriteLine(CStr(dictObj("results")(0)("address_components")(2)("long_name")))
    End Sub
End Module
于 2018-06-03T07:59:44.950 に答える