【发布时间】:2016-07-13 08:30:17
【问题描述】:
我通过 Newtonsoft.json 将字典序列化为 json 和下面的代码:
var serializeSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Full,
Formatting = Formatting.Indented
};
var serializedObject = JsonConvert.SerializeObject(dic, serializeSettings);
这段代码生成一个像这样的json:
{
"$type": "System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"9648af76-7986-4b34-8b2c-97b2345769ef": "Test"
}
我尝试通过此代码将 json 反序列化为字典:
var newDic = new Dictionay<Guid,string>();
var deserializeSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Full,
Formatting = Formatting.Indented
}
JsonConvert.PopulateObject(serializedObject, newDic, deserializeSettings);
但是发生了这个异常:
无法将字符串“$type”转换为字典键类型“System.Guid”。创建一个 TypeConverter 以从字符串转换为键类型对象。路径“$type”,第 2 行,位置 10。
在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateDictionary(IDictionary 字典, JsonReader reader, JsonDictionaryContract contract, JsonProperty containerProperty, String id)
在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target)
在 Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target)
在 Newtonsoft.Json.JsonSerializer.Populate(JsonReader reader, Object target)
在 Newtonsoft.Json.JsonConvert.PopulateObject(String value, Object target, JsonSerializerSettings 设置)
我这样写 GuidConverter 并使用它。但不工作
public class GuidConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(Guid));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
try
{
return serializer.Deserialize<Guid>(reader);
}
catch
{
return Guid.Empty;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
编辑:
我发现了我的问题。更改代码以将 json 反序列化为 Dictionary 现在生成的字典中的第一项是:
Kay: "$type"
Value : "System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
为什么?
【问题讨论】:
-
您需要 dspecial 设置和 Guid 吗?不妨试试
JsonConvert.SerializeObject(dic);之类的更简单的方法,看看是否能满足您的需求。 -
@senschen 我使用泛型类来序列化和反序列化项目中的多种类型。我项目中的其他类型需要这个设置。请阅读我的问题的最后编辑
-
使用字符串而不是 Guid @Fred
-
@ZehraSubaş 在我的问题的最后编辑中,我这样做了,但是..
标签: c# json dictionary serialization json.net