【问题标题】:Newtonsoft json serializer returns empty objectNewtonsoft json 序列化程序返回空对象
【发布时间】:2014-01-29 06:07:53
【问题描述】:

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

我刚刚将我的 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

【问题讨论】:

    标签: json json.net


    【解决方案1】:

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

    我编写了一个基本解析器(至少对我们而言),它使 Newtonsoft 序列化器的行为更像一个基本的可序列化对象序列化器 - 即序列化所有 PROPERTIES,并且不使用自定义 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
            };
    

    【讨论】:

    • 谢谢,这个答案帮助我解决了 JSON.NET 序列化程序没有序列化恰好具有空字符串值的公共字符串属性的问题.....我需要将它们包含在生成的 JSON 中javascript 期望属性存在
    • 我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多