0

I can choose an object to serialize with code like below, and I can ignore the object without [DataMember] on serialization.


namespace MyProject
{
    [DataContract]
    public class MyClass
    {
        public string aaa { get; set; }
        [DataMember] public string bbb { get; set; }
        [DataMember] public string ccc { get; set; }
    }
}
String  str = JsonConvert.SerializeObject((MyClass)jsonClass);

// "{\"bbb\":\"1111\",\"ccc\":\"222\"}"

Then, I want to switch two serialization patterns. shown as below


namespace MyProject
{
    [DataContract]
    public class MyClass
    {
        [DataMember_pattern1] public string aaa { get; set; }
        [DataMember_pattern1, DataMember_pattern2] public string bbb { get; set; }
        [DataMember_pattern2] public string ccc { get; set; }
    }
}

// output I need
// serialized in pattern1
// "{\"aaa\":\"0000\", \"bbb\":\"1111\"}"

// serialized in pattern2
// "{\"bbb\":\"1111\",\"ccc\":\"222\"}"

and I want to do this on deserialization too. Is this possible?

Show
  • 3
  • 1
  • Don't customize serializer. Create two different DTOs for "patter1" and "pattern2", and serialize them depending on your current requirements. – Dennis Nov 12 '20 at 10:54
  • I assume from your question that it's always the same type? I.e. both when you serialize and deserialize you know it's a MyClass? In that case how do you decide which pattern you want to follow? A flag inside the class? Or something external to it? – Adam Benson Nov 12 '20 at 11:57
  • A [custom contract resolver](https://www.newtonsoft.com/json/help/html/contractresolver.htm#CustomIContractResolverExamples) might meet your needs. See e.g. [Conditional member serialization based on query parameter?](https://stackoverflow.com/q/29713847/3744182), [Custom serializer for just one property in Json.NET, without changing the model class](https://stackoverflow.com/q/53768041/3744182) and [How can I tell Json.NET to ignore properties in a 3rd-party object?](https://stackoverflow.com/q/25749509/3744182). Do those answer your question sufficiently? – dbc Nov 12 '20 at 15:53

2 Answers2

0

You can try using inheritance

public class MyClass
{
     public string bbb { get; set; }

     public virtual string aaa { get; set; }

     public virtual string ccc { get; set; }
}

public class MyClassA : MyClass
{
    [JsonIgnore]
    public override  string ccc { get; set; }
}
public class MyClassC : MyClass
{
    [JsonIgnore]
    public override string aaa { get; set; }

}

var jsonClassA = new MyClassA()
{
    aaa= "0000",
    ccc ="222",
    bbb = "1111"
};
var jsonClassC = new MyClassC()
{
    aaa = "0000",
    ccc = "222",
    bbb = "1111"
};
//{"bbb":"1111","aaa":"0000"}
String strA = JsonConvert.SerializeObject((MyClass)jsonClassA);
//{"bbb":"1111","ccc":"222"}
String strC = JsonConvert.SerializeObject((MyClass)jsonClassC);
Stanislav
  • 459
  • 3
  • 6
0

Create 2 classes that implement the two patterns:

namespace MyProject
{
    public class MyClass
    {
        public string aaa { get; set; }
        public string bbb { get; set; }
        public string ccc { get; set; }

        public string SerialisePattern1 => JsonConvert.SerializeObject(new MyClass_Pattern1 { Underlying = this });
        public string SerialisePattern2 => JsonConvert.SerializeObject(new MyClass_Pattern2 { Underlying = this });
    }

    public class MyClass_Pattern1
    {
        public string aaa => Underlying.aaa;
        public string ccc => Underlying.ccc;
        [JsonIgnore]
        public MyClass Underlying { get; set; }
    }

    public class MyClass_Pattern2
    {
        public string bbb => Underlying.bbb;
        public string ccc => Underlying.ccc;
        [JsonIgnore]
        public MyClass Underlying { get; set; }
    }
}

or:

namespace MyProject
{
    public class MyClass
    {
        public string aaa { get; set; }
        public string bbb { get; set; }
        public string ccc { get; set; }

        public string SerialisePattern1 => JsonConvert.SerializeObject(new { aaa, ccc });
        public string SerialisePattern2 => JsonConvert.SerializeObject(new { bbb, ccc });
    }
}
Liam
  • 5,033
  • 2
  • 30
  • 39