我有一个像这样的字典,它可以从json文件反序列化为C#字典
{
"Name": "option1",
"Settings": {
"setting1": 20,
"setting2": 2
}
}
所以我将其反序列化为一个可以工作的对象,但是当我尝试从字典中获取该值时,它变成了long而不是int
if (!settings.TryGetValue("setting1", out object setting))
{
setting = 10;
}
然后在其他地方我做这样的事情:
if ((int)setting > 10) {//do something}
然后它给我一个错误,一个int64无法转换为int32
反序列化过程:
using (StreamReader reader = new StreamReader(Startup.SettingsPath))
{
SettingsModel settings = JsonConvert.DeserializeObject<SettingsModel>(reader.ReadToEnd()).Applications;
return settings
}
SettingsModel:
public class SettingsModel
{
public string Name { get; set; }
public IDictionary<string, object> Settings { get; set; }
}
答案 0 :(得分:0)
如果您确实需要将数字反序列化为整数,则可以将自定义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());
}
}
通过以下方式将自定义转换器类的实例传递给DeserializeObject()
方法:
JsonConvert.DeserializeObject<SettingsModel>(reader.ReadToEnd(), new CustomConverter());
答案 1 :(得分:-1)
我有一个实例需要在这种情况下一次性完成。我实现了以下内容。
private int GetInt(KeyValuePair<string, object> pair)
{
object value = pair.Value;
Type valueType = value.GetType();
if (property.PropertyType.IsAssignableFrom(typeof(int)))
{
value = Convert.ToInt32(value);
}
}