ホームページ > バックエンド開発 > C++ > Newtonsoft.JSONの脱介入のクラスプロパティに子供のJSONプロパティをマッピングする方法は?

Newtonsoft.JSONの脱介入のクラスプロパティに子供のJSONプロパティをマッピングする方法は?

Mary-Kate Olsen
リリース: 2025-01-24 23:12:11
オリジナル
503 人が閲覧しました

How to Map Child JSON Properties to Class Properties in Newtonsoft.Json Deserialization?

newtonsoft.jsonでの砂漠化中のクラス属性へのモーンレドサブアトリビュート

newtonsoft.json

属性を使用すると、元のjson属性名をクラス属性に許可します。ただし、場合によっては、複雑なJSONオブジェクトのサブアトリビュートは、JSONオブジェクトのサブアトリビュートの単純な属性にマッピングされる場合があります。

[DataMember]伝統的な方法

追加の属性のみが必要な場合、1つの方法は、JSONをjobjectとして解決し、および

を使用してクラスを入力して追加の属性を取得することです。

ToObject()属性のみが必要な複雑なSelectToken()属性を含むjsonオブジェクトを検討してください:

picture picture.data.urlcustom jsonコンバーター

<code class="language-json">{
    "picture": 
    {
        "id": 123456,
        "data": 
        {
            "type": "jpg",
            "url": "http://www.someplace.com/mypicture.jpg"
        }
    }
}</code>
ログイン後にコピー
<code class="language-csharp">public class Person
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("age")]
    public string Age { get; set; }

    public string ProfilePicture { get; set; }
}

string json = @"{...}";

JObject jo = JObject.Parse(json);
Person p = jo.ToObject<Person>();
p.ProfilePicture = (string)jo.SelectToken("picture.data.url");</code>
ログイン後にコピー
よりエレガントなソリューションを取得するために、

属性が期待どおりに機能するようにカスタムJSonConverterを作成できます。このコンバーターは、反射と上記のテクノロジーを使用して属性を埋めるためにクラスレベルで実行されます。

実証するために、より複雑なJSONオブジェクトを検討してください:

[JsonProperty]

以下のターゲットクラスでは、各属性パスが
<code class="language-csharp">public class JsonPathConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        object targetObj = Activator.CreateInstance(objectType);

        foreach (var prop in objectType.GetProperties()
                                        .Where(p => p.CanRead && p.CanWrite))
        {
            var att = prop.GetCustomAttributes(true)
                           .OfType<JsonPropertyAttribute>()
                           .FirstOrDefault();

            string jsonPath = (att != null ? att.PropertyName : prop.Name);
            JToken token = jo.SelectToken(jsonPath);

            if (token != null && token.Type != JTokenType.Null)
            {
                object value = token.ToObject(prop.PropertyType, serializer);
                prop.SetValue(targetObj, value, null);
            }
        }

        return targetObj;
    }
}</code>
ログイン後にコピー
属性仕様を使用します。

これらの属性を使用すると、深化のシリアル化はシームレスでなければなりません:
<code class="language-json">{
  "name": "Joe Shmoe",
  "age": 26,
  "picture": {
    "id": 123456,
    "data": {
      "type": "jpg",
      "url": "http://www.someplace.com/mypicture.jpg"
    }
  },
  "favorites": {
    "movie": {
      "title": "The Godfather",
      "starring": "Marlon Brando",
      "year": 1972
    },
    "color": "purple"
  }
}</code>
ログイン後にコピー

以上がNewtonsoft.JSONの脱介入のクラスプロパティに子供のJSONプロパティをマッピングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート