这是我的情况。我们正在决定使用什么Json序列化工具。我们正在考虑Newtonsoft.JSON和微软JavaScriptSerializer。Newtonsoft.JSON是我们的第一次窥视,但我们在奇怪的行为上绊倒了。这是用来稀释问题的原理图代码。假设我们对阶级有如下的处理方式:
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字符串,我们可以使用以下代码:
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想出了更全面的解决方案,所以如果你想看到它只是跟随链接,他提供了这个问题的复制。
发布于 2016-09-02 19:16:12
你不需要DataContractAttribute
和DataMemberAttribute
来做Json.Net。删除它们,你的代码就会起作用..。
要么将它们用于所有属性,要么从不使用它们--。
请参阅http://www.newtonsoft.com/json/help/html/DataContractAndDataMember.htm
如果您不想使用任何Attributes
,那么您可以创建一个自定义ContractResolver
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;
}
}
并将代码序列化为:
string jsonOutput = Newtonsoft.Json.JsonConvert.SerializeObject(b,
new Newtonsoft.Json.JsonSerializerSettings()
{
NullValueHandling = Newtonsoft.Json.NullValueHandling.Include,
ContractResolver = new MyDefaultContractResolver()
});
https://stackoverflow.com/questions/39299225
复制相似问题