【问题标题】:Serialize public properties using JSON.NET使用 JSON.NET 序列化公共属性
【发布时间】:2011-12-19 13:31:23
【问题描述】:

我正在使用 JSON.NET 实现将 .NET 对象序列化/反序列化为 JS,反之亦然,在运行 GetWCFData() 之前一切正常:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

    public class WebLookup
    {
        WCFService.WCFServiceClient svc;
        IsoDateTimeConverter DateConverter = new IsoDateTimeConverter();


        List<WCFContract.Language> Languages { get; set; }
        List<WCFContract.Group> Groups { get; set; }
        List<WCFContract.User> Users { get; set; }

        public WebLookup()
        {
            DateConverter.DateTimeFormat = "dd/MM/yyyy";
            DateConverter.DateTimeStyles = System.Globalization.DateTimeStyles.AssumeLocal;
        }

        public string GetWCFData()
        {
            svc = new WCFService.WCFServiceClient();
            WebLookup weblookup = new WebLookup();
            weblookup.Languages = svc.GetWCFLanguages().ToList();
            weblookup.Groups = svc.GetWCFGroups().ToList();
            weblookup.Users = svc.GetWCFUsers().ToList();

            return JsonConvert.SerializeObject(weblookup, DateConverter);
        } 

    }

成员 LanguagesGroupsUsers 在调用 WCF 服务时成功填充,但 JsonConvert.SerializeObject(lookup, DateConverter) 总是向客户端(Web 浏览器)返回一个空 JSON 字符串,这很奇怪,因为它通常在其他领域对我来说效果很好,唯一的区别是这里我将填充的 WebLookup 成员声明为公共属性类本身。

【问题讨论】:

  • 有什么理由不使用内置的JavaScriptSerializerDataContractJsonSerializer
  • 您收到的错误是什么?
  • 我实际上只是将序列化行替换为:return new JavaScriptSerializer().Serialize(weblookup) 以查看它是否有任何不同但得到相同的结果,一个空字符串。
  • @Bojan-Skrchevski 没有错误,只是一个空字符串,尽管 weblookup 的语言、组和用户填充了值。
  • @Maya - 我也没有在 WebLookup 类中看到序列化属性。你是否包括:[JsonObject(MemberSerialization.[option])] ???

标签: c# wcf json serialization json.net


【解决方案1】:

Languages、Groups 和 Users 属性需要声明为 Public 成员才能被 JSON.NET 或内置 JavaScriptSerializer 序列化,您的代码中不是这种情况。

【讨论】:

  • 不敢相信我错过了,现在数据已正确序列化,谢谢!
  • 这个答案并不完全正确。将属性[JsonProperty]属性添加到属性中,它将被序列化。
  • @Nuzzolilo 不,这个答案是正确的,它为我完成了这项工作,添加 [JsonProperty] 不起作用,实际上这个属性只存在于 JSON.NET 4.5