web-dev-qa-db-ja.com

Newtonsoft JSON-動的オブジェクト

Newtonsoft JSONライブラリを使用して、受信した生のJSONで動的な逆シリアル化を実行していますが、説明できないことが見つかりました。

開始点は、次のJSON文字列です。

{
  "task": {
    "dueDate": "2012-12-03T00:00:00"
  }
}

複雑すぎない...

コードで私はこれをやっています:

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson);
DateTime dueDate = dyn.task.dueDate.Value;

このコードは数か月間使用されていて正常に機能しますが、最近のテストビルドでは次のエラーが発生していました。

「Newtonsoft.Json.Linq.JObject」には「task」の定義が含まれていません

スタックトレース:System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0、TRet](CallSiteサイト、T0 arg0)のCallSite.Target(Closure、CallSite、Object)

これが奇妙なところです。上記のコードを次のように変更すると、すべてが再び機能し始めます:

DateTime dueDate = dyn.task.dueDate.Value;

DateTime dueDate = dyn["task"]["dueDate"].Value;

したがって、これは「修正済み」ですが、なぜ修正されるのか、考えられる原因は何なのかわかりません。誰にもアイデアはありますか

39
MrEyes

これを試すことができます:

dynamic task = JObject.Parse(rawJson);

ドキュメント: JSONを動的にクエリする

44
Hylaean

私の場合、私は最初のチャンスの例外をキャッチしていたことがわかったので、この例外はスローされていましたが、実際にはコードの実行を妨げていませんでした。

すべてのコンテンツではなく、Json.NETによって逆シリアル化された一部のコンテンツでこれが発生する理由を知ることはまだ素晴らしいことです。たとえば、ユニットテストでjson.netでシリアル化した動的オブジェクトを使用し、シリアル化されたコンテンツを逆シリアル化します。シリアル化されたコンテンツは、実行時にランタイムバインダー例外がスローされる原因となるコンテンツと同一に見えます。

5
Shaun Wilson

同じ問題がありました。

Json.NET 6.0.4がこの問題の原因です。Json.Net6.0.5に変更する必要があります。 Json.NET 6.0.4を参照するプロジェクトはありません。

[ツール]-> [NuGetパッケージマネージャー]-> [ソリューションのNuGetパッケージの管理]に移動し、プロジェクトでJson.NET 6.0.4を使用している場合は修正します。

4
DaNeSh

これは確かにいくつかの参照の問題です、私はちょうど同じ問題を抱えていました、問題を削除した直後にVSSでチェックインできるようにパッケージフォルダをプロジェクトに追加したということが判明しました(ごめん、必須) Visual Studioのパッケージフォルダー、正常に動作し始めた

1
BlackTigerX

Json.NETを使用するアプリでも同じ問題が発生しました。この問題は特定の1台のマシンでのみ再発し、そのマシンには別のバージョンのJson.NETがGACにインストールされていたことが判明しました。 GACから削除した後、アプリは正常に動作し始めました。

1
v.shashenko

しばらくこの問題が続いていましたが、使用されたDLLは、動的をサポートしていない.NET 3.5向けにコンパイルされていました。..DLLが.NET 4.5以降

1
E Perl