Сериализация сложного класса в простую строку - PullRequest
0 голосов
/ 06 мая 2019

У меня есть «сложный» (довольно простой, но все еще содержащий члены, которые я не хочу сериализовать) класс, который определяет неявное преобразование из / в строку.(Он может восстановить все свои данные из этой одной строки).

Этот класс используется для членов более сложного класса, де-сериализованного JSON.

Без другой конфигурации JSON можетиспользовать это преобразование для создания этого типа, когда он отправляется из браузера.Мне нужен какой-то простой способ сказать JSON игнорировать ВСЕХ членов класса и просто сериализовать класс, как если бы это была строка.

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

Сейчас оно производит:

"SomeOtherMemberOfClass: "Some value",
"MemberOfMyType": {
    "UnimportantMember1": true,
    "UnimportantMember2": 123456789,
    "TheImportantString": "I want to see this"
  }

Я бы хотел, чтобы оно произвело:

"SomeOtherMemberOfClass: "Some value",
"MemberOfMyType": "I want to see this"

Как я уже сказал, если браузер отправляет данные в моем желаемом формате, мой класс десериализуется очень хорошо, но он все равно отправляет элемент как сложный тип, что нежелательно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Ваш класс выглядит следующим образом:

public class MemberOfMyType
{
    public bool UnimportantMember1 { get; set; }
    public int UnimportantMember2 { get; set; }
    public string TheImportantString { get; set; }
}
public class GoodClass
{
    public MemberOfMyType MemberOfMyType { get; set; }
    public string SomeOtherMemberOfClass { get; set; }
}

Затем вы можете использовать JsonConverterAtrribute для достижения того, что вы хотите.Украсьте свой класс с помощью JsonConverterAtrribute, как показано ниже.

[JsonConverter(typeof(GoodCassConverter))]
public class GoodClass
{
    public MemberOfMyType MemberOfMyType { get; set; }
    public string SomeOtherMemberOfClass { get; set; }
}

public class GoodClassConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        MyGoodClass myclass = value as MyGoodClass;

        writer.WriteValue(myclass..); //do your thing here.
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        MyGoodClass myclass = new MyGoodClass();
        myclass.SomeOtherMemberOfClass = (string)reader.Value; //do some stuffs with the string here.

        return myclass;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(MyGoodClass);
    }
}
0 голосов
/ 06 мая 2019

Если вы используете Json.NET, я думаю, пользовательский JsonConverter примерно такой же легкий, как и вы.Ваше требование состоит не в том, чтобы игнорировать определенные элементы , а в том, чтобы сериализовать сложный объект, как если бы он был строкой, и десериализовать строку в сложный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...