9

好的 - 我已经为此努力了几个小时。是时候寻求帮助了。

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

我已经用我自己的 MediaTypeFormatter 替换了序列化程序,它也调用了 Newtonsoft Json 序列化程序,这样我就可以连接并查看工作正常。我看到的是一个进入序列化器的对象,并以“{}”的形式出现。

这在我升级之前可以工作。

这是我的对象

[Serializable]
public class Parameters
{
    public string ApplicantName { get; set; }
}

我只是在打电话:

var result = JsonConvert.SerializeObject(new Parameters(){ Name = "test" });

我回来

"{}"

这是怎么回事??

[编辑]

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

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

4

1 回答 1

5

好的 - 有很多变化,结果是对 Json 输出进行了一些非常激进的变化。这些更改还包括如何应用自定义 TypeConverters。

我已经编写了一个基本解析器,它(至少对我们来说)使 Newtonsoft 序列化器的行为更像一个基本的可序列化对象序列化器 - 即序列化所有属性,并且不使用自定义 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
        };
于 2012-06-16T04:41:26.903 回答