好的 - 我几个小时以来一直在反对这个问题。是时候寻求帮助了。
我刚刚将我的Web应用程序项目升级到ASP.NET MVC 4 RC和新的WebApi。 我的web api方法现在返回EMPTY json“{}” - 即使我的对象已完全填充。
我已经用我自己的MediaTypeFormatter替换了序列化程序,它也调用了Newtonsoft Json序列化程序,这样我就可以挂钩并看到工作正常了。 我看到的是一个进入序列化器的对象,并以“{}”形式出现。
这个USED在我升级之前工作。
这是我的对象
[Serializable]
public class Parameters
{
public string ApplicantName { get; set; }
}
我只是在打电话:
var result = JsonConvert.SerializeObject(new Parameters(){ Name = "test" });
我回来了
"{}"
怎么回事?
[编辑]
其他人遇到同样的问题......在运行Newtonsoft源代码之后,我可以看到我们在最近的更改中遇到了完全相同的问题。
答案 0 :(得分:5)
好的 - 已经发生了很多变化,结果是对Json输出进行了一些非常彻底的改变。这些更改还包括如何应用自定义TypeConverters。
我编写了一个基本的解析器(至少对我们来说)会导致Newtonsoft序列化程序更像基本的Serializable对象序列化程序 - 即序列化所有属性,并且不使用自定义TypeConverters ...
/// <summary>
/// A resolver that will serialize all properties, and ignore custom TypeConverter attributes.
/// </summary>
public class SerializableContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
protected override IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
foreach (var p in properties)
p.Ignored = false;
return properties;
}
protected override Newtonsoft.Json.Serialization.JsonContract CreateContract(Type objectType)
{
var contract = base.CreateContract(objectType);
if (contract is Newtonsoft.Json.Serialization.JsonStringContract)
return CreateObjectContract(objectType);
return contract;
}
}
*注册* 在你的MvcApplication“Application_Start”中......
GlobalConfiguration.Configuration.Formatters
.JsonFormatter.SerializerSettings.ContractResolver =
new SerializableContractResolver()
{
IgnoreSerializableAttribute = true
};