使用Newtonsoft.Json并给出下面的"问候语"类,我试图允许"消息"像现在一样反序列化,并作为字符串.

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!"}}

我确实考虑过使用通用的

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反序列化/序列化?或者我使用了上面的实现,但不知何故将其隐藏了起来?

感谢所有帮助!

推荐答案

写一个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; }
}

Csharp相关问答推荐

Mstest + Coverlet在收件箱中没有达到100%的覆盖率,但我在Codecov中得到了100%的覆盖率

try 在C#中启动Tunnelbear.Exec

我正在制作一个Unity游戏,如果对这个玩家控制器进行编码,但当它 skip 时,它会删除我的速度

如何使用Microsoft Curve API从搜索的文件中获取内容(文本)?

亚马逊Pinpoint C# SDK

当MD5被废弃时,如何在Blazor WASM中使用它?

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

EF Core Fluent API中定义的多对多关系

LINQ无法翻译SQLFunctions方法

什么是通过反射创建类的泛型接口方法的正确方法?

SignalR客户端不会打印队列位置'

MAUI查询参数单一字符串项将不起作用

Rx.Net窗口内部可观测数据提前完成

用C#从Word文档中删除重复的节控件和文本内容控件

Regex字母数字校验

HelperText属性不支持复杂内容(混合C#和标记)

当try 测试具有协变返回类型的抽象属性时,类似功能引发System.ArgumentException

在扩展方法中,IEnumerable<;T>;不会转换为IEumerable<;T&>

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

无效的Zip文件-Zip存档