c# JSON反序列化为接口或字符串



使用Newtonsoft。Json并给出"问候";在下面的类中,我尝试允许"Message"像现在这样反/序列化,并作为字符串。

public class Greeting
{
public IHello Message { get; set; }
}
public interface IHello
{
string Phrase { get; set; }
}
public class Hello1 : IHello
{
public string Phrase { get; set; }
}
var greeting = new Greeting
{
Message = new Hello1
{
Phrase = "Yo!"
}
};
var jsonText = JsonConvert.SerializeObject(greeting);

电流输出:{"Message":{"Phrase":"Yo!"}}我还想输出{"Message":"Yo!"}

我确实考虑过使用泛型

public class Greeting<T>
{
public T Message { get; set; }
}

但是我不想让用户知道如何设置

var greeting = new Greeting<string> { Message = "" };

var greeting = new Greeting<Hello1> { Message = new Hello1 { Phrase = "Yo!" }};

是否有可能以另一种方式实现所需的json反/序列化?或者我使用上面的实现,但把它隐藏起来?

感谢所有的帮助!

你可以这样修改Greeting类:

public interface IMessaging : IEnumerable<char>, IEnumerable, ICloneable, IComparable, IComparable<String?>, IConvertible, IEquatable<String?>, IHello
{
}
public class Greeting
{
public Greeting SetMessage<T>(T message) where T: IMessaging
{
Message = message;
return this;
}

public object Message { get; set; }
}

然后你可以用

var greeting = new Greeting().SetMessage("Yo");
var jsonText = JsonConvert.SerializeObject(greeting);

结果{"Message":"Yo"}

或者这样:

var greeting = new Greeting().SetMessage(new Hello1 { Phrase = "Yo!" });
var jsonText = JsonConvert.SerializeObject(greeting);

,结果{"Message":{"Phrase":"Yo!"}}或者你可以添加任何你想要的接口到Greeting Class

写一个CustomConverter。在这里,我创建了一个可以与Hello1一起使用的自定义转换器,它只是省略了一些数据。如果您使用Hello2类,则包含所有内容。

public class Hello1Converter : Newtonsoft.Json.JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Hello1);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var obj = value as IHello;
writer.WriteValue(obj.Phrase);
}
}

并像这样使用:

[TestMethod]
public void TestMethod1()
{
var greeting = new Greeting
{
Message = new Hello1
{
Phrase = "Yo!"
}
};
var greeting2 = new Greeting
{
Message = new Hello2
{
Phrase = "Yo!"
}
};
var jsonText1 = JsonConvert.SerializeObject(greeting, Formatting.Indented, new Hello1Converter());
var jsonText2 = JsonConvert.SerializeObject(greeting2, Formatting.Indented, new Hello1Converter());
}

jsonText1:

{
"Message": "Yo!"
}

jsonText2:

{
"Message": {
"Phrase": "Yo!"
}
}

请注意,这只处理序列化。对于反序列化,您还需要实现ReadJson

和你的类:

public class Greeting
{
public IHello Message { get; set; }
}
public interface IHello
{
string Phrase { get; set; }
}
public class Hello1 : IHello
{
public string Phrase { get; set; }
}
public class Hello2 : IHello
{
public string Phrase { get; set; }
}

最新更新