Сериализация общедоступных свойств с помощью JSON.NET

Я использую реализацию 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);
        } 

    }

Члены Languages, Groups и Users успешно заполняются при вызове службы WCF, но JsonConvert.SerializeObject(lookup, DateConverter) всегда возвращает клиенту (веб-браузеру) пустую строку JSON, это странно, так как это обычно отлично работает для меня в других областях, единственная разница в том, что здесь у меня есть заполненные WebLookup члены, объявленные как общедоступные свойства в самом классе.


person Maya    schedule 19.12.2011    source источник
comment
Есть ли причина не использовать встроенные JavaScriptSerializer или DataContractJsonSerializer?   -  person David Pfeffer    schedule 19.12.2011
comment
Какую ошибку вы получаете?   -  person TheBoyan    schedule 19.12.2011
comment
На самом деле я только что заменил строку сериализации на: return new JavaScriptSerializer().Serialize(weblookup), чтобы увидеть, отличается ли она, но получил тот же результат, пустую строку.   -  person Maya    schedule 19.12.2011
comment
@Bojan-Skrchevski Никаких ошибок, просто пустая строка, несмотря на то, что в weblookup языки, группы и пользователи заполнены значениями.   -  person Maya    schedule 19.12.2011
comment
@Maya - также я не вижу атрибутов сериализации в классе WebLookup. Вы включаете: [JsonObject(MemberSerialization.[option])] ???   -  person TheBoyan    schedule 19.12.2011
comment
Хорошо, я попытался добавить [JsonObject(MemberSerialization.OptOut)], затем [JsonObject(MemberSerialization.OptIn)] в начало класса, но это, к сожалению, все еще не работает, тот же результат (возвращенная строка {} )   -  person Maya    schedule 19.12.2011


Ответы (1)


Свойства Languages, Groups и Users должны быть объявлены как открытые члены, чтобы их можно было сериализовать с помощью JSON.NET или встроенного JavaScriptSerializer, но в вашем коде это не так.

person Samara    schedule 19.12.2011
comment
Не могу поверить, что пропустил это, теперь данные сериализуются правильно, спасибо! - person Maya; 21.12.2011
comment
Этот ответ не совсем правильный. Добавьте атрибут [JsonProperty] к свойству, и оно будет сериализовано. - person nuzzolilo; 15.05.2012
comment
@Nuzzolilo Нет, этот ответ правильный, он сработал за меня, добавление [JsonProperty] не сработало, на самом деле это свойство существовало только в JSON.NET 4.5. - person Maya; 25.07.2012