これは非常に一般的な問題です。 "JsonConvert.SerializeObject"を使用することは悪い考えではありません。しかし、いくつかの状況(通常はコレクション)で使用できる1つのトリックは、読み込み時に単純な導関数に書き込んだりデシリアライズするときにインターフェイスにキャストすることです。
以下
KVPsのセットとしてではなく、(:)ここでは私の年齢を示す)オブジェクトのように見える連載されている可能性があります辞書を扱う簡単なコンバータです
注「WriteJsonは、」IDictionaryを< Kへのキャスト、V>と "ReadJson"は "DummyDictionary"を使用します。あなたは正しいことに終わりますが、再帰を起こさずに渡されたシリアライザを使います。
/// <summary>
/// Converts a <see cref="KeyValuePair{TKey,TValue}"/> to and from JSON.
/// </summary>
public class DictionaryAsKVPConverter<TKey, TValue> : JsonConverter
{
/// <summary>
/// Determines whether this instance can convert the specified object type.
/// </summary>
/// <param name="objectType">Type of the object.</param>
/// <returns>
/// <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
/// </returns>
public override bool CanConvert(Type objectType)
{
if (!objectType.IsValueType && objectType.IsGenericType)
return (objectType.GetGenericTypeDefinition() == typeof(Dictionary<,>));
return false;
}
/// <summary>
/// Writes the JSON representation of the object.
/// </summary>
/// <param name="writer">The <see cref="JsonWriter"/> to write to.</param>
/// <param name="value">The value.</param>
/// <param name="serializer">The calling serializer.</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var dictionary = value as IDictionary<TKey, TValue>;
serializer.Serialize(writer, dictionary);
}
/// <summary>
/// Reads the JSON representation of the object.
/// </summary>
/// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
/// <param name="objectType">Type of the object.</param>
/// <param name="existingValue">The existing value of object being read.</param>
/// <param name="serializer">The calling serializer.</param>
/// <returns>The object value.</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Dictionary<TKey, TValue> dictionary;
if (reader.TokenType == JsonToken.StartArray)
{
dictionary = new Dictionary<TKey, TValue>();
reader.Read();
while (reader.TokenType == JsonToken.StartObject)
{
var kvp = serializer.Deserialize<KeyValuePair<TKey, TValue>>(reader);
dictionary[kvp.Key] = kvp.Value;
reader.Read();
}
}
else if (reader.TokenType == JsonToken.StartObject)
// Use DummyDictionary to fool JsonSerializer into not using this converter recursively
dictionary = serializer.Deserialize<DummyDictionary>(reader);
else
dictionary = new Dictionary<TKey, TValue>();
return dictionary;
}
/// <summary>
/// Dummy to fool JsonSerializer into not using this converter recursively
/// </summary>
private class DummyDictionary : Dictionary<TKey, TValue> { }
}
これは質問された質問には答えません。問題は「JsonConvertを使用してオブジェクトをシリアル化するにはどうすればよいのですか?カスタムJsonConverter内部からの再帰的ループを避ける方法を尋ねていました。 ['JsonConvert'](http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonConvert.htm)と[' JsonConverter'](http://www.newtonsoft.com/json/help/html /T_Newtonsoft_Json_JsonConverter.htm)は、Json.Netの2つの全く異なるクラスです。 –