相关疑难解决方法(0)

覆盖Json.Net中的默认原始类型处理

有没有办法在处理原始类型时覆盖Json.net的默认反序列化行为?例如,当将json数组反序列化为[3.14,10,"test"]类型object[] 3.14时,类型为10,double10类型long.反正我有可以拦截或覆盖此类型的决定,所以我可以反序列化值decimal,并int分别?

我基本上总是希望json整数总是返回,int并且浮动返回为decimal.这将节省我一些有注入doubledecimal转换在我的代码.

我已经考虑扩展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)

.net c# primitive json.net

5
推荐指数
1
解决办法
3517
查看次数

Dictionary&lt;string, object&gt; 返回 long 而不是 int

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

c#

5
推荐指数
1
解决办法
966
查看次数

标签 统计

c# ×2

.net ×1

json.net ×1

primitive ×1