栗子:
using Test = Dictionary<Vector2Int, Vector2>;
public class NewBehaviourScript : MonoBehaviour
{
private void Awake()
{
Test list = new Test();
list.Add(Vector2Int.zero, Vector2Int.one);
list.Add(new Vector2Int(9999, 6666), Vector2Int.one);
var jsonSerializerSettings = new JsonSerializerSettings()
{
//防递归
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
//自定义类型转换器
Converters = { new DictionaryJsonConverter<Vector2Int, Vector2>() }
};
var json = JsonConvert.SerializeObject(list, jsonSerializerSettings);
var o = JsonConvert.DeserializeObject<Test>(json, jsonSerializerSettings);
foreach (var item in o)
{
Debug.Log($"{item.Key}====={item.Value}");
}
}
}
字典转换器:
/// <summary>
/// 字典类型转换器
/// </summary>
/// <typeparam name="Key"></typeparam>
/// <typeparam name="Value"></typeparam>
public class DictionaryJsonConverter<Key, Value> : JsonConverter<IDictionary<Key, Value>>
{
public override IDictionary<Key, Value> ReadJson(JsonReader reader, Type objectType, IDictionary<Key, Value> existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var dictionary = new Dictionary<Key, Value>();
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndObject)
{
return dictionary;
}
if (reader.TokenType != JsonToken.PropertyName)
{
throw new JsonException();
}
//序列化Key
string propertyName = reader.Value.ToString();
var key = JsonConvert.DeserializeObject<Key>(propertyName);
//序列化Value
reader.Read();
var value = serializer.Deserialize<Value>(reader);
dictionary.Add(key, value);
}
throw new JsonException();
}
public override void WriteJson(JsonWriter writer, IDictionary<Key, Value> value, JsonSerializer serializer)
{
writer.WriteStartObject();
foreach (var item in value)
{
var propertyName = JsonConvert.SerializeObject(item.Key,new JsonSerializerSettings() { ReferenceLoopHandling= ReferenceLoopHandling.Ignore});
writer.WritePropertyName(propertyName);
serializer.Serialize(writer, item.Value);
}
writer.WriteEndObject();
}
}