Пользовательский тип данных в JSON

У меня есть пользовательские классы типов данных, которые я хочу преобразовать в .NET в JSON (а позже также обратно в CustomDataType).

Я знаю, что классы без какого-либо специального определения будут преобразованы в объекты, просто путем сериализации всех общедоступных свойств. Но это не то, что мне нужно.

Предположим, что у меня есть класс

public class MyString : System.Object {
    private string myString;
    public MyString(string str) {
        this.myString = str;
    }
    public override bool Equals(System.Object obj)
    public override int GetHashCode()
    public string ToString() {
        return "!!!"+myString+"!!!";
    }
}

Теперь, если я использую этот тип в своем ApiController

public class MyItem {
    public MyString someStr;
}
public class MyApiController : ApiController {
    [HttpGet]
    public MyItem MyApi() {
        MyItem item = new MyItem();
        item.someStr = new MyString("I have a dream");
        return item;
    }
}

я получил

{"someStr":{}}

но я могу захотеть получить

{"someStr":"!!!I have a dream!!!"}

or

{"someStr":{"words":4,"chars":11,"length":14}}

без фактического раскрытия каких-либо свойств как общедоступных.

Как бы я этого добился?


person Alexander    schedule 17.09.2014    source источник
comment
Почему вы явно вытекаете из Object??????   -  person Matías Fidemraizer    schedule 17.09.2014
comment
Я не могу представить ни одного случая, когда имеет смысл сериализовать приватные свойства, это как бы противоречит всей концепции приватности. И затем, как бы вы представили их десериализацию?   -  person EkoostikMartin    schedule 17.09.2014
comment
Но каким-то образом String, Int32, Boolean и, если вам не нравятся эти примитивные типы данных, DateTime, сериализуются иначе, чем объект, содержащий все общедоступные свойства. Я надеюсь, что Microsoft не решила обрабатывать только эти типы, отличные от других, в своем сериализаторе JSON?   -  person Alexander    schedule 17.09.2014


Ответы (1)


WebApi использует сериализатор Json для получения вашего результата, когда вы ожидаете, что он выполнит на нем ToString().

Я лично не имел дело с большим количеством частных переменных (или свойств) при сериализации объектов, однако меня не удивляет, что он это делает.

Чтобы получить желаемый результат, вам нужно предоставить свойство, которое возвращает !!!<whatever text>!!!.

person Cameron    schedule 17.09.2014