首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JSON.NET JsonConvert.SerializeObject()奇特行为

JSON.NET JsonConvert.SerializeObject()奇特行为
EN

Stack Overflow用户
提问于 2016-09-02 19:06:54
回答 1查看 1K关注 0票数 0

这是我的情况。我们正在决定使用什么Json序列化工具。我们正在考虑Newtonsoft.JSON和微软JavaScriptSerializer。Newtonsoft.JSON是我们的第一次窥视,但我们在奇怪的行为上绊倒了。这是用来稀释问题的原理图代码。假设我们对阶级有如下的处理方式:

代码语言:javascript
运行
复制
interface IA<T>
{
    T Id { get; set; }
}

[DataContractAttribute]
abstract class A : IA<string>
{
    protected A() { }

    [DataMemberAttribute]
    public virtual  string Id
    {
        get;
        set;
    }
}
class B : A
{
    public string P1 { get; set; }
    public string P2 { get; set; }
}

然后,如果我们使用Newtonsoft.Json的JsonConvert类从B类中获取JSON字符串,我们可以使用以下代码:

代码语言:javascript
运行
复制
        B b = new B();
        string jsonOutput = Newtonsoft.Json.JsonConvert.SerializeObject(b, 
            new Newtonsoft.Json.JsonSerializerSettings() { 
                NullValueHandling = Newtonsoft.Json.NullValueHandling.Include 
            });

但是不幸的是,只有Id属性会反映在结果的JSON字符串中。B类的所有其他属性都不会出现。相反,JavaScriptSerializer按预期的方式生成JSON字符串。B类是我们的类,A类和接口IA来自第三方库,所以我们不能修改它们。另外,我们也不希望在类上使用数据契约序列化注释,这也只是为了安抚挑剔的json序列化程序。

是否有任何方法指示Newtonsoft.Json.JsonConvert序列化所有属性,而不论是否带注释?

编辑:虽然@LB提供了可以接受的答案@dbc想出了更全面的解决方案,所以如果你想看到它只是跟随链接,他提供了这个问题的复制。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-02 19:16:12

你不需要DataContractAttributeDataMemberAttribute来做Json.Net。删除它们,你的代码就会起作用..。

要么将它们用于所有属性,要么从不使用它们--

请参阅http://www.newtonsoft.com/json/help/html/DataContractAndDataMember.htm

如果您不想使用任何Attributes,那么您可以创建一个自定义ContractResolver

代码语言:javascript
运行
复制
public class MyDefaultContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var result = base.CreateProperties(type, memberSerialization).ToList();
        result.ForEach(x => { x.Ignored = false; }); // <-- Include or not? 
        return result;
    }
}

并将代码序列化为:

代码语言:javascript
运行
复制
string jsonOutput = Newtonsoft.Json.JsonConvert.SerializeObject(b,
new Newtonsoft.Json.JsonSerializerSettings()
{
    NullValueHandling = Newtonsoft.Json.NullValueHandling.Include,
    ContractResolver = new MyDefaultContractResolver()
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39299225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档