首页 > 解决方案 > C# 可以用 Json 序列化枚举描述而不是枚举值

问题描述

我遇到了从两个不同的 Web 服务收到响应的情况。这两个响应的结构相同,但具有不同的父命名空间。我要做的是将这些响应转换为标准类,然后我可以将其传递给父对象。我认为最简单的方法是将传入的对象序列化为 Json,然后将对象反序列化为我的标准对象。这使我的处理代码相当简单

var jsonString = JsonConvert.SerializeObject(serviceResponse.Results);
var commonObject = JsonConvert.DeserializeObject<StandardResult>(jsonString);

在大多数情况下,这是有效的。但是,我正在扩展 StandardResult 对象,但我发现了一些问题。

对象的属性之一是具有以下属性的类:

public class EntryDetailType
{
public string EntryNumber {get; set;}
public string EntryText {get; set;
public int Item {get; set;}
}

问题是它Item实际上可能是传入数据中的两个不同枚举之一。因此,尽管转换正确地将枚举的值放入其中,Item但我不知道该值指的是哪个枚举。我不在这个阶段使用 JsonConverter 类,因为对象非常大,我想尽可能避免这种情况。

作为此过程的一部分,是否有一种方法能够获取枚举的描述而不是值,还是我将被迫编写自己的 json 转换器?请记住,该EntryDetailType课程不在我的项目中。它是通过 wsdl 文档添加的 Web 服务的返回类型。

标签: c#jsonenums

解决方案


好吧,如果该类EntryDetailType确实具有名为Itemtype的属性int,则无法推断出enum您拥有的名称表示值。

但是,如果这个类有Item任何enum类型的属性,那么它就像使用内置StringEnumConverter作为 SerializeObject 方法的第二个参数来序列化到 Json 一样简单:

var jsonString = JsonConvert.SerializeObject(serviceResponse.Results, new Newtonsoft.Json.Converters.StringEnumConverter()); 

ps:我假设您使用的是 NewtonSoft 的 Json.NET。


推荐阅读