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

Mat*_*ton 5 .net c# primitive 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)

L.B*_*L.B 1

我想,这应该有效

public class MyReader : JsonTextReader
{
    public MyReader(string s) : base(new StringReader(s))
    {
    }

    protected override void SetToken(JsonToken newToken, object value)
    {
        object retObj = value;
        if (retObj is long) retObj = Convert.ChangeType(retObj, typeof(int));
        if (retObj is double) retObj = Convert.ChangeType(retObj, typeof(decimal));

        base.SetToken(newToken, retObj);
    }
}


object[] variousTypes = new object[] { 3.14m, 10, "test" };
string jsonString = JsonConvert.SerializeObject(variousTypes);

JsonSerializer serializer = new JsonSerializer();
var asObjectArray = serializer.Deserialize<object[]>(new MyReader(jsonString));
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案最终仍然会转换为双精度数,然后转换为小数。它有可能会失去直接解析为小数可以获得的精度。也就是说,查看 Json.NET 代码,除了更改 Json.NET 的实现之外,我没有看到任何其他解决方案。 (4认同)