将复杂的类序列化为简单的字符串

时间:2019-05-06 15:26:31

标签: c# json serialization

我有一个“复杂”(相当简单,但仍然包含我不想序列化的成员)类,该类定义了从字符串到字符串的隐式转换。 (它可以从一个字符串中重建所有数据)。

此类用于JSON反序列化的更复杂类的成员。

在没有其他配置的情况下,当从浏览器发送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 :(得分:0)

假设您正在使用Json.NET,我认为custom JsonConverter的轻量化程度将与您将要获得的一样轻。您的要求不仅仅是忽略某些成员,而是将复杂对象序列化为字符串,然后将字符串反序列化为复杂对象。

答案 1 :(得分:0)

您的课程如下:

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);
    }
}