字典<string,object =“”>返回long而不是int

时间:2019-01-18 11:50:26

标签: c#

我有一个像这样的字典,它可以从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; }
}

2 个答案:

答案 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);
    }
}