Newtonsoft json序列化程序返回空对象

Ada*_*dam 9 json json.net

好的 - 我几个小时以来一直在反对这个问题.是时候寻求帮助了.

我刚刚将我的Web应用程序项目升级到ASP.NET MVC 4 RC和新的WebApi.我的web api方法现在返回EMPTY json"{}" - 即使我的对象已完全填充.

我已经用我自己的MediaTypeFormatter替换了串行器,它也调用了Newtonsoft Json序列化器,这样我就可以挂钩并查看工作情况.我看到的是一个对象进入序列化器,并以"{}"形式出现.

这个USED在我升级之前工作.

这是我的目标

[Serializable]
public class Parameters
{
    public string ApplicantName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我只是打电话给:

var result = JsonConvert.SerializeObject(new Parameters(){ Name = "test" });
Run Code Online (Sandbox Code Playgroud)

我回来了

"{}"
Run Code Online (Sandbox Code Playgroud)

这是怎么回事??

[编辑]

其他人有同样的问题...在运行Newtonsoft源代码后,我可以看到我们在最近的更改中遇到了完全相同的问题.

http://json.codeplex.com/discussions/357850

Ada*_*dam 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

*注册* 在您的MvcApplication"Application_Start"中......

GlobalConfiguration.Configuration.Formatters
    .JsonFormatter.SerializerSettings.ContractResolver = 
        new SerializableContractResolver()
        {
            IgnoreSerializableAttribute = true
        };
Run Code Online (Sandbox Code Playgroud)