JavaScriptSerializer
を使用する: フィールド名マッピングの課題問題: JavaScriptSerializer
を使用して JSON データを C# オブジェクトに直接逆シリアル化すると、JSON フィールド名が C# プロパティ名と異なる場合に問題が発生することがよくあります。 XmlElement
属性では、このマッピングの問題は解決されません。
シナリオ:
次の JSON があるとします。
<code class="language-json">{"user_id":1234, "detail_level":"low"}</code>
これに対応する C# クラス:
<code class="language-csharp">public class DataObject { public int UserId { get; set; } public DetailLevel DetailLevel { get; set; } public enum DetailLevel { Low, /* ... other values */ } }</code>
JavaScriptSerializer
は、名前が一致しないため、フィールドを正しくマップできません。
解決策: DataContractJsonSerializer
推奨されるアプローチは、代わりに DataContractJsonSerializer
を使用することです。このシリアライザーにより、DataMember
属性を介した明示的なマッピングが可能になります。
変更された C# クラス:
<code class="language-csharp">using System.Runtime.Serialization; [DataContract] public class DataObject { [DataMember(Name = "user_id")] public int UserId { get; set; } [DataMember(Name = "detail_level")] public string DetailLevel { get; set; } }</code>
注: 列挙型の潜在的な逆シリアル化の問題を回避するために、DetailLevel
プロパティは string
になりました。
使用例:
<code class="language-csharp">using System.IO; using System.Runtime.Serialization.Json; using System.Text; // ... within a test method ... [TestMethod] public void DataContractJsonSerializerTest() { string jsonData = "{\"user_id\":1234, \"detail_level\":\"low\"}"; DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataObject)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)); // UTF8 encoding is crucial DataObject dataObject = (DataObject)serializer.ReadObject(ms); Assert.IsNotNull(dataObject); Assert.AreEqual(1234, dataObject.UserId); Assert.AreEqual("low", dataObject.DetailLevel); }</code>
このコードは、名前の違いにもかかわらず、DataContractJsonSerializer
が JSON フィールド (「user_id」、「detail_level」) を対応する C# プロパティ (UserId
、DetailLevel
) に正しくマップする方法を示しています。 運用環境での逆シリアル化中に潜在的な例外を処理することを忘れないでください。
以上がJavaScriptSerializer を使用して JSON フィールド名を別の C# オブジェクト フィールド名にマッピングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。