JSON.NET - How do I include Type Name Handling for primitive C# types that are stored in an array/list as Object type

ε祈祈猫儿з 提交于 2019-12-23 09:48:39

问题


I am using Newtonsoft JSON.NET to serialize/deserialize stuff for me. But I have this list wherein they are of Object type:

var list = new List<Object>() 
{ 
    "hi there", 
    1,
    2.33  
};

When I serialize that with TypeNameHandling set to TypeNameHandling.All, I was expecting that it will also give a $type for each instance on the list but doesn't seem to be the case. Here is the actual output:

{
    "$type": "System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib",
    "$values": [
        "hi there",
        1,
        2.33
    ]
}

I need this to have specific Type Name Handling for those primitive types because if I add an Int32 value in to the list and when it comes back after deserializing it JSON.NET sets it as Int64. That is a big deal for me because I am trying to invoke some methods and to do that I need to compare the parameters and they MUST have the same types. Is there a way or a setting you can set in JSON.NET to achieve what I need?

I've seen this post but what it does is that he is trying to change the default behavior and always return Int32 which is not what I'm looking for.

Any help would be appreciated. Thanks


回答1:


You can create a wrapper class for primitive types, included implicit operators as you want:

class TypeWrapper
{
    public object Value { get; set; }
    public string Type { get; set; }

    public static implicit operator TypeWrapper(long value)
    {
        return new TypeWrapper { Value = value, Type = typeof(long).FullName };
    }

    public static implicit operator long(TypeWrapper value)
    {
        return (long)value.Value;
    }

    public static implicit operator TypeWrapper(int value)
    {
        return new TypeWrapper { Value = value, Type = typeof(int).FullName };
    }

    public static implicit operator int(TypeWrapper value)
    {
        return (int)value.Value;
    }
}

Then you will have element' types when serialize data:

var data = new List<TypeWrapper> { 1, 2L };
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
Console.WriteLine(json);

// result: [{"Value":1,"Type":"System.Int32"},{"Value":2,"Type":"System.Int64"}]


来源:https://stackoverflow.com/questions/35592256/json-net-how-do-i-include-type-name-handling-for-primitive-c-sharp-types-that

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!