jsonデータ
質問:
JSONデータを処理する場合、同じ属性を単一の値として表現することも、値配列として表現することもできます。たとえば、sendgrid APIから取得した次の有効な負荷:
「カテゴリ」属性は、この問題を示しています。特定のプロジェクトでは、文字列であり、他のアイテムでは、文字列配列です。 JSON.NETは、この矛盾に対処するための2つの方法を提供します。送信されたデータを変更するか、json.netを構成して違いを受け入れます。
<code class="language-json">[ { "email": "[email protected]", "timestamp": 1337966815, "category": [ "newuser", "transactional" ], "event": "open" }, { "email": "[email protected]", "timestamp": 1337966815, "category": "olduser", "event": "open" } ]</code>解決策:jsonconveter
推奨される方法は、カスタムJSonConverrerを使用することです。データを後付けするクラスを定義しましょう:
単一のアイテムまたは配列である可能性のある属性(この例「カテゴリ」)の場合、それをリストとして定義し、そのレトロフィットを処理するためにカスタムコンバーターを指定します。
<code class="language-csharp">class Item { [JsonProperty("email")] public string Email { get; set; } [JsonProperty("timestamp")] public int Timestamp { get; set; } [JsonProperty("event")] public string Event { get; set; } [JsonProperty("category")] [JsonConverter(typeof(SingleOrArrayConverter<string>))] public List<string> Categories { get; set; } }</code>以下は、コンバーターの実装です。
このコンバーターは、ラベルが配列に渡されるか、単一のアイテムにそれに応じて処理されるかどうかを決定します。それが配列である場合、それをリスト
使用法と出力
<code class="language-csharp">class SingleOrArrayConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(List<T>)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken token = JToken.Load(reader); if (token.Type == JTokenType.Array) { return token.ToObject<List<T>>(); } if (token.Type == JTokenType.Null) { return null; } return new List<T> { token.ToObject<T>() }; } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }</code>
カスタムコンバーターを使用するには、以下に示すようにデリバティブコードを更新してください:
プログラムは正しくシリアル化されたJSONデータになり、「カテゴリ」属性は、単一の状況と配列の状況のために適切に文字列リストに入力されます。 この方法は、同じプロパティでJSONデータを組み合わせて処理する柔軟な方法を提供します。
以上が同じプロパティのシングル値と配列値が混在しているJSONデータを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。