有没有办法在处理原始类型时覆盖Json.net的默认反序列化行为?例如,当将json数组反序列化为[3.14,10,"test"]类型object[] 3.14时,类型为10,double而10类型long.反正我有可以拦截或覆盖此类型的决定,所以我可以反序列化值decimal,并int分别?
我基本上总是希望json整数总是返回,int并且浮动返回为decimal.这将节省我一些有注入double到decimal转换在我的代码.
我已经考虑扩展Newtonsoft.Json.Serialization.DefaultContractResolver和实现自己的,Newtonsoft.Json.JsonConverter但我没有发现任何方法来实现这个所需的覆盖.
重现的示例代码
object[] variousTypes = new object[] {3.14m, 10, "test"};
string jsonString = JsonConvert.SerializeObject(variousTypes);
object[] asObjectArray = JsonConvert.DeserializeObject<object[]>(jsonString); // Contains object {double}, object {long}, object {string}
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的字典,它从 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)