ホームページ >バックエンド開発 >C++ >JavaScriptSerializer を使用して JSON フィールド名を別の C# オブジェクト フィールド名にマッピングするにはどうすればよいですか?

JavaScriptSerializer を使用して JSON フィールド名を別の C# オブジェクト フィールド名にマッピングするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-10 08:22:41244ブラウズ

How Can I Map JSON Field Names to Different C# Object Field Names Using JavaScriptSerializer?

JSON 逆シリアル化に 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# プロパティ (UserIdDetailLevel) に正しくマップする方法を示しています。 運用環境での逆シリアル化中に潜在的な例外を処理することを忘れないでください。

以上がJavaScriptSerializer を使用して JSON フィールド名を別の C# オブジェクト フィールド名にマッピングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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