25

.Dump()LinqPad でNewtonsoft JSON.Netを呼び出そうとするとJObject、例外が発生します。

RuntimeBinderException: 'Newtonsoft.Json.Linq.JObject' に 'Dump' の定義が含まれていません。

これは、LinqPad の他のほとんどすべてで機能します。他のオブジェクトと同じように Newtonsoft をダンプして、JObjectプロパティ名や値などを表示するメソッドを見つけたいと思います。

JSON文字列をダンプする方法はすでに理解していますが、単なるテキスト文字列ではなく、オブジェクトが出力されることを望んでいます。

4

9 に答える 9

21

これは静的拡張メソッドであるため、静的メソッドとして呼び出すことができます。

LINQPad.Extensions.Dump(jObject);

コンパイラが何らかの理由で拡張機能にバインドできない場合(おそらく)、一部のタイプでこれが発生することがわかります。

LinqPadのサイトに投稿があり、オブジェクトでの使用に関するブログ投稿があります。Dump()dynamic

のプロパティを調べる別のDump()拡張機能を作成して、きれいに編集できるJObject辞書を作成してみてください。Dump

このようなもの:(JObjectの定義に基づく完全なWAG):

var values = jObject.Properties.ToDictionary(p=>p.Name, p=>p.Value);
values.Dump();

もちろん、ネストされたオブジェクトなどに再帰を追加することもできます。

//Usage: GetProperties(jObject).Dump();
public static object GetProperties(object o)
{
    JObject j = o as JObject;
    if(j == null)
    {
        return o.ToString();
    }
    return j.Properties().ToDictionary(p=>p.Name,p=>GetProperties(p.Value));
}
于 2013-01-18T20:07:51.523 に答える
7

私の推測では、あなたは次のようなことをしていると思います。

dynamic foo = ...;
foo.Dump();

拡張メソッド(つまりDump)は、動的型付けでは機能しません。使用する場合:

object foo = ...;
foo.Dump();

それなら私はそれがうまく「機能する」と期待しています。JObjectただし、のプロパティは動的に提供されるJSONプロパティではないため、実際に必要なことを実行できない可能性があります。

(D Stanleyの回答に従って明示的に拡張メソッドを呼び出すことも機能しますが、拡張メソッドとしてそれを行う方が便利な場合があります。)

Dump編集:Json.NETについて何も知らず、おそらくデバッガーのように動的オブジェクトを処理しないことを考えると、単にあなたが望むものを提供しないことを強く疑っています。Dumpのプロパティを反復処理しJObjectて再帰的にダンプする独自のメソッドを作成するのがおそらく最善でしょう。それでも箱から出して何かを見つけたい場合は、LINQPadを探すのではなく、おそらくJson.NETのドキュメントを調べる必要がありますが、何かが見つかるかどうかはわかりません。

于 2013-01-18T20:07:21.197 に答える
2

これはうまくいくようです:

dynamic dyn = ... // parse some JSON or whatever
((JObject)dyn).Properties().ToDictionary(p=>p.Name, p=>p.Value).Dump();

リストがある場合、これは機能します:

dynamic[] dyns = ...
dyns.Cast<JObject>().Select(o => o.Properties().ToDictionary(p => p.Name, p => p.Value)).Dump();

また、これは linqpad プログラムを持っている場合に便利です:

static class JsonNetDumper {
  public static IEnumerable<IDictionary<string, object>> ToDumpable(this IEnumerable<object> rg) { 
    return rg.Cast<JObject>().Select(o => o.Properties().ToDictionary(p => p.Name, p => (object)p.Value));
  }
}

これは次のように使用できます。

dynamic[] dyns = ...
dyns.ToDumpable().Dump();
于 2014-02-18T21:43:49.870 に答える
1

JObject本当にプロパティを持っていません、それはたくさんのJArrayそしてJPropertyガンクです。前の回答で提案されているように拡張メソッドを直接使用するか、ダイナミックをキャストしobjectてダンプすることができます。.ToString()ただし、それを使用してJSON表現に変換し直し、それをダンプする方がよいでしょう。

var data = JsonConvert.DeserializeObject(@"{...}");
LINQPad.Extensions.Dump(data); // gives JObject, JArray, etc
((object)data).Dump(); // gives JObject, JArray, etc
((string)data.ToString()).Dump(); // given the JSON string back again

やや関連して、ダンプ時に通常のオブジェクトjsonに変換する.DumpJsonメソッドに出くわしました。カスタム拡張機能の記述方法を説明しているため、主に言及します。Dump

于 2013-01-25T17:24:38.083 に答える
1

LINQPad の new を使用すると、Newtonsoft JSON.Netを直接ToDump実行できます。.Dump()JObject

このスニペットを LINQPad のMy Extensionsクエリに追加します

static Object ToDump(Object input)
{
    var json = input as JObject;
    if (json != null)
        return json.ToObject<ExpandoObject>();
    return input;
}

Netwonsoft.Jsonまた、メイン クエリに対して行ったのと同じ参照を追加する必要があります。

于 2017-11-14T15:07:02.503 に答える
-1

今日、Nuget を介して JSON.NET ライブラリを追加し、データが JObject である data.Dump() から構造化データを取得して (エラーなしで)、JObject でこれを試してみました。

ここに画像の説明を入力

于 2014-07-17T05:38:45.810 に答える