如何通过newtonsoft.json.jsonconvert.serialobject确保公共类和继承类之间的一致性

时间:2016-04-05 06:49:54

标签: c# json

当我使用Newtonsoft序列化对象时遇到问题,

当我序列化一个继承类的实例的对象时,例如:

class A
{
    public string A { get; set; }
}

class B:A
{
    public string B { get; set; }
}

和C类:

class C
{
    public string A { get; set; }

    public string B { get; set; }
}

我在服务器端使用B类,在客户端使用我的客户,因为他只知道必须使用哪个属性,并且我们都使用相同的策略逻辑来制作加密字符串。我发现序列化字符串的顺序不相等:B可能是[A:1;B:2]而C可能是[B:2:A:1],希望你的帮助。

这是我的测试数据:

[
    {
        "amount":100.0,
        "memberId":75,
        "orderId":233,
        "projectId":233,
        "consumeNo":"6d1dd604b0844fa28b78380e5a05f1c1"
    }
]                                      
客户给我的帖子数据是:

[
    {
        "memberid":75,
        "orderid":233,
        "amount":100.0,
        "projectid":233,
        "consumeno":"6d1dd604b0844fa28b78380e5a05f1c1"
    }
] 

你可以看到帐号和memberid和orderid是不一样的顺序,因为他用C而我用B

最后我通过使用另一种方法和下面的代码来实现:

var settings = new JsonSerializerSettings()
               {
                   ContractResolver = new OrderedContractResolver()
               };

string listJons = JsonConvert.SerializeObject(item.Value,settings);


public class OrderedContractResolver : DefaultContractResolver
{
    protected override System.Collections.Generic.IList<JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
    {
        return base.CreateProperties(type, memberSerialization).OrderBy(p  => p.PropertyName).ToList();
    }
}

0 个答案:

没有答案