我有一个看起来像这样的字典,它从 json 文件反序列化为 C# 字典
{
"Name": "option1",
"Settings": {
"setting1": 20,
"setting2": 2
}
}
Run Code Online (Sandbox Code Playgroud)
所以我将其反序列化为一个可以工作的对象,但是当我尝试从字典中获取该值时,它变成了 long 而不是 int
if (!settings.TryGetValue("setting1", out object setting))
{
setting = 10;
}
Run Code Online (Sandbox Code Playgroud)
然后我在其他地方做了这样的事情:
if ((int)setting > 10) {//do something}
Run Code Online (Sandbox Code Playgroud)
然后它给了我一个 int64 无法转换为 int32 的错误
反序列化过程:
using (StreamReader reader = new StreamReader(Startup.SettingsPath))
{
SettingsModel settings = JsonConvert.DeserializeObject<SettingsModel>(reader.ReadToEnd()).Applications;
return settings
}
Run Code Online (Sandbox Code Playgroud)
设置型号:
public class SettingsModel
{
public string Name { get; set; }
public IDictionary<string, object> Settings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您确实需要将数字反序列化为整数,您可以将自定义实现JsonConverter为:
public class CustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(object).Equals(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken jToken = JValue.ReadFrom(reader);
switch (reader.TokenType)
{
case JsonToken.Integer:
return jToken.Value<int>();
case JsonToken.String:
return jToken.Value<string>();
// ...and so on...
default:
throw new ArgumentException($"Unknown JsonToken: '{reader.TokenType}'.");
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
将自定义转换器类的实例传递给该DeserializeObject()方法,如下所示:
JsonConvert.DeserializeObject<SettingsModel>(reader.ReadToEnd(), new CustomConverter());
Run Code Online (Sandbox Code Playgroud)