0

私はyahooの連絡先APIのjson応答を逆シリアル化していますが、すべてが順調に進んでいますが、1つのフィールドfields、その配列で問題が発生していますが、すべての要素valueが異なり、どのように処理できますか。2つのフィールドでは、これは文字列であり、他の要素オブジェクトではです。これが私のサンプルjsonです

"fields": [
      {
       "created": "2008-12-29T13:47:21Z",
       "updated": "2008-12-29T13:47:21Z",
       "uri": "http://social.yahooapis.com/v1/user/ASASASASASASA/contact/8/email/18",
       "id": "18",
       "type": "email",
       "value": "papi@ymail.com",
       "editedBy": "OWNER"
      },
      {
       "created": "2010-03-30T07:02:04Z",
       "updated": "2011-06-25T05:01:51Z",
       "uri": "http://social.yahooapis.com/v1/user/ASASASASASASA/contact/8/guid/42",
       "id": "42",
       "type": "guid",
       "value": "BMM5JTQVDB7G4EBPO2D5ESE3TI",
       "editedBy": "OWNER",
       "isConnection": "false"
      },
      {
       "created": "2008-12-29T13:47:21Z",
       "updated": "2008-12-29T13:47:21Z",
       "uri": "http://social.yahooapis.com/v1/user/ASASASASASASA/contact/8/name/17",
       "id": "17",
       "type": "name",
       "value": {
        "givenName": "Hitesh",
        "middleName": null,
        "familyName": "Lohar",
        "prefix": null,
        "suffix": null,
        "givenNameSound": null,
        "familyNameSound": null
       },
       "editedBy": "OWNER"
      }
     ]

フィールド用に次のクラスを作成しました

public class YahooField
    {
        [JsonProperty("created")]
        public string Created { get; set; }

        [JsonProperty("updated")]
        public string Updated { get; set; }

        [JsonProperty("uri")]
        public string Uri { get; set; }

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        //here confusion
        //[JsonProperty("value")]
        //public (String or class) Value { get; set; }

        [JsonProperty("editedBy")]
        public string EditedBy { get; set; }

        [JsonProperty("isConnection")]
        public string IsConnection { get; set; }
    }
4

1 に答える 1

0

valueプロパティは単なる別のオブジェクトです。ValueFieldという新しいクラスを作成し、いくつかのプロパティを追加します。

  1. ミドルネーム
  2. 苗字
  3. プレフィックス
  4. サフィックス
  5. GiveNameSound
  6. FamilyNameSound

そして、このクラスをプロパティとしてYahooFieldクラスに追加します

public class YahooField
    {
        [JsonProperty("created")]
        public string Created { get; set; }

        [JsonProperty("updated")]
        public string Updated { get; set; }

        [JsonProperty("uri")]
        public string Uri { get; set; }

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("value")]
        public ValueField Value { get; set; }

        [JsonProperty("editedBy")]
        public string EditedBy { get; set; }

        [JsonProperty("isConnection")]
        public string IsConnection { get; set; }
    }

プロパティValueがString型であるかどうかを検出するには、独自のコントラクトリゾルバーを作成する必要があります。このようにして、デフォルトの動作を中断し、独自のロジックを実装できます。

DefaultContractResolverからCustomContractResolverを派生させ、実装に必要な仮想メソッドをオーバーライドするだけです。

public class CustomContractResolver: DefaultContractResolver
{
//override the methods you need.
}

次の手順を実行して、カスタムコントラクトリゾルバーを設定できます。

  JsonConvert.SerializeObject(
    product,
    Formatting.Indented,
    new JsonSerializerSettings { ContractResolver = new CustomContractResolver() }
  );
于 2012-06-13T06:50:58.030 に答える