43

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」には「タスク」の定義が含まれていません

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

上記のコードを次のように変更すると、すべてが再び機能し始めます。

DateTime dueDate = dyn.task.dueDate.Value;

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

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

4

7 に答える 7

51

あなたはこれを試すことができます:

dynamic task = JObject.Parse(rawJson);

ドキュメント:動的なJSONのクエリ

于 2012-12-07T16:38:32.853 に答える
5

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

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

于 2013-12-23T09:04:00.333 に答える
4

私も同じ問題を抱えていました。

Json.NET 6.0.4 がこの問題の原因です。Json.Net 6.0.5 に変更する必要があります。どのプロジェクトも Json.NET 6.0.4 を参照してはなりません。

Tools -> NuGet Package Manager -> Manage NuGet Packages for solution... に移動し、プロジェクトのいずれかが Json.NET 6.0.4 を使用しているかどうかを確認し、それらを修正します。

于 2014-10-10T18:39:59.180 に答える
1

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

于 2013-08-09T04:53:28.820 に答える
0

多くの動的なことを行っていたプロジェクトがあったので、私は同様の問題を抱えていました。

絞り込んだのは…… JsonElementとシリアライズ。動的を使用すると、基になる型が存在し、JSON へのシリアル化は、そのオブジェクトを何にシリアル化する必要がありますか? ダイナミックは、文字列、数値、日時、True、False などです。そのため、ダイナミックを参照するときにシリアル化でそれを認識できるように、メタデータも少し置く必要があります。

だから...シリアル化すると、ダイナミックがJsonElementに変換されると思います-ValueKindとValueをプロパティとして指定します。

逆シリアル化すると、事態は複雑になります... JSON to C# はクラス内のプロパティと一致し、宛先として動的である場合は、JSON 要素情報に基づいて動的を復元する必要があります。

ここが曖昧なところですが、Serialzation を調べて ValueKind を見つけたら、反対側に問題がある可能性が高いことは確かです。

Text.Json (MS) のデシリアライゼーションとシリアライゼーションも見てください。newtonsoft と MS がダイナミクスのシリアライゼーションとデシリアライゼーションを処理する方法の違いだと思います。

于 2020-09-15T21:59:54.923 に答える