Сериализовать свойство пользовательского типа в строку с помощью JavascriptSerializer

Я уже некоторое время использую класс .NET JavascriptSerializer, чтобы сериализовать свой объект в представление JSON и использовать его на стороне клиента. Все отлично работает, пока я придерживаюсь типов по умолчанию, таких как int, string и т. д. Однако теперь я хочу сериализовать свойство пользовательского типа для своего объекта. Давайте посмотрим на пример моего класса:

public class ClientData 
{      
    public Guid Id { get; set; }
    public string Description { get; set; }
    public MyCustomObject ObjectX { get; set; }
}

Что мне нужно, так это клиентский объект, который выглядит примерно так:

{ Id: 0000-0000-000-0000, Description: "some description", ObjectX: "125.20" }

Чтобы заставить эту работу работать, я попытался использовать JavaScriptConverter, но это, похоже, не решает проблему, потому что он может обрабатывать только словари, в результате чего результат будет выглядеть следующим образом:

{ Id: 0000-0000-000-0000, Description: "some description", ObjectX: { Value: "125.20"} }

Это не то, чего я хочу. Кстати, я реализовал toString в классе MyCustomObject.

Какие-либо предложения?

Большое спасибо.


person user683870    schedule 30.03.2011    source источник
comment
Вы имеете в виду объект ClientData или объект MyCustomObject? В любом случае, оба не являются сериализуемыми в явном виде. Я что-то пропустил?   -  person user683870    schedule 30.03.2011
comment
Моя ошибка. Класс MyCustomObject имеет атрибут [Serializable] (и имеет реализацию ToString). Так что, похоже, это не трюк.   -  person user683870    schedule 30.03.2011


Ответы (3)


вот страница msdn для javascriptserializer: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

в разделе примечаний написано:

Чтобы сериализовать объект, используйте метод Serialize. Чтобы десериализовать строку JSON, используйте методы Deserialize или DeserializeObject. Чтобы сериализовать и десериализовать типы, которые изначально не поддерживаются JavaScriptSerializer, реализуйте пользовательские преобразователи с помощью класса JavaScriptConverter. Затем зарегистрируйте преобразователи с помощью метода RegisterConverters.

поэтому вам следует взглянуть на этот класс: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptconverter.aspx

person Fender    schedule 30.03.2011
comment
У меня есть конвертер для этого класса, но он не делает того, что мне нужно: var result = new Dictionary‹string, object›(); результат.Добавить(Значение, obj.ToString()); вернуть результат; Он создает объект свойства, как описано в моем первом посте. - person user683870; 30.03.2011
comment
ты регистрировал конвертер? - person Fender; 30.03.2011
comment
Ага... в результате получается следующее: { Id: 0000-0000-000-0000, Description: какое-то описание, ObjectX: { Value: 125.20} } - person user683870; 30.03.2011

Использование JsonConverter из библиотеки Json.NET, похоже, помогло мне.

person user683870    schedule 30.03.2011

Пользовательский объект можно преобразовать в строку. Вы используете JavaScriptConverter, который преобразует ваш объект в экземпляр Uri, который также реализует IDictionary, чтобы разрешить его передачу из JavaScriptConverter.

Этот хак описан для объектов DateTime здесь: http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/

person Sebastian Markbåge    schedule 28.12.2011