Dictionary<string, object> 返回 long 而不是 int

kjw*_*mme 5 c#

我有一个看起来像这样的字典,它从 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)

kaf*_*opp 2

如果您确实需要将数字反序列化为整数,您可以将自定义实现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)