ホームページ  >  記事  >  バックエンド開発  >  属性値の逆シリアル化失敗の問題を解決するにはどうすればよいですか?

属性値の逆シリアル化失敗の問題を解決するにはどうすればよいですか?

零下一度
零下一度オリジナル
2017-06-23 16:22:114247ブラウズ

はじめに: webapi インターフェイスを開発していたとき、次のような問題に遭遇しました。複雑な Json 文字列がオブジェクトに逆シリアル化されると、属性オブジェクトの 1 つがシリアル化できないのですか?

使用法:

InternalRecommendRequestFormModel formData = Newtonsoft.Json.JsonConvert.DeserializeObject<InternalRecommendRequestFormModel>(dataInput);

その中で: InternalRecommendRequestFormModel は複雑なオブジェクトであり、そのプロパティには他のオブジェクトとプロパティが含まれています。 dataInput は、インターフェイスによって渡される JSON 文字列であり、別のインターフェイスによって返される InternalRecommendRequestFormModel オブジェクトです。当然、データの一部のプロパティは、通常は逆シリアル化される必要がありますが、使用時に逆シリアル化されます。エラーが報告され、属性の 1 つをシリアル化できません。

それでは、この種の複雑なオブジェクトへの逆シリアル化に遭遇した場合はどうすればよいでしょうか?

まず第一に: 分析の結果、エラーは個々の属性のシリアル化の失敗によって引き起こされていることが示されているため、これらの属性をクリアできるか、属性のシリアル化されたコンテンツを削除できる限り、問題はありません。

それで: シリアル化された JSON 文字列からいくつかの属性を削除するにはどうすればよいでしょうか?

私たちが最初に思いつくのは、ストリングの交換、クリア、インターセプトなどですが、間違いを犯しやすいです。この文字列を操作可能なオブジェクト (もちろん InternalRecommendRequestFormModel ではありません) に変換し、オブジェクトを強制終了またはクリアしてから、それを必要なオブジェクトに変換できますか? 実は、最初にオブジェクトについて考えたとき、どんなオブジェクトもオブジェクトではないでしょうか?

試してみましょう:

object formData = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dataInput);

次のようにオブジェクトを取得します:

デバッグ中に見つかりました:

((Newtonsoft.Json.Linq.JObject)(JsonConvert.DeserializeObject(dataInput)))。 ChildrenTokens[46] で属性値を取得できます。

つまり、上記のコードからわかるように、逆シリアル化されたオブジェクト オブジェクトは、Newtonsoft.Json.Linq.JObject オブジェクトに変換されます。このオブジェクトは、Microsoft が提供する JSON オブジェクトの基本クラスです。 、オブジェクトである限り、それが json によってシリアル化されている場合は、逆シリアル化して戻すのに役立ちます。

コードは次のように改善されました:

InternalRecommendRequestFormModel formData = new InternalRecommendRequestFormModel();Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);
obj.Remove("opinions");
formData = obj.ToObject<InternalRecommendRequestFormModel>();

概要:

JSON 文字列がオブジェクトである限り、JSON 文字列を直接逆シリアル化して、文字列が要件を満たしていません。まずオブジェクトを JObject に変換し、次にオブジェクトのプロパティを変更してから、JObject が提供する ToObject() を使用して、変換する必要があるオブジェクトに変換します

<strong><span style="font-size: 15px">Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);</span></strong><br>

以上が属性値の逆シリアル化失敗の問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。