首页 > 解决方案 > 序列化列表计数而不是列表

问题描述

我正在将 Web 服务接收到的 XML 请求记录在 JSON 文件中。我们有一个具有所有属性的类,如下所示:

class RequestExternal
{
  [XmlAttribute("FirstName")]
  [JsonProperty]
  public string Firstname{get; set;}

  [XmlAttribute("FirstName")]
  [JsonProperty]
  public string LastName{get; set;}

  [XmlAttribute("FirstName")]
  [JsonProperty] -- To be changed : Want to log this as PaymentCards.Count
  public List<Object> PaymentCards{get; set;}
}

我想将此请求记录为:

{
  FirstName: 'XXX',
  LastName: 'XXX',
  PaymentCount: **count of PaymentCard list**
}

有没有办法通过 JsonConverter 或其他方法来做到这一点?

我可以通过引入一个新的派生属性来做到这一点。

但这对我不起作用。我们有一个文档机制,可以将这些新属性公开给客户。

标签: c#json.netjson.net

解决方案


取决于您的用例的具体情况以及您是否有权访问类定义。您可以轻松编写转换器注释属性

给定

public class ListToCountConverter : JsonConverter<IList>
{
   public override void WriteJson(JsonWriter writer, IList value, JsonSerializer serializer)
      => writer.WriteValue(value.Count);

   public override IList ReadJson(JsonReader reader, Type objectType, IList existingValue, bool hasExistingValue, JsonSerializer serializer)
       => throw new NotImplementedException();
}

你的班

class RequestExternal
{
   ...
   [JsonProperty] 
   [JsonConverter(typeof(ListToCountConverter))]
   public List<Object> PaymentCards { get; set; }
}

例子

var test = new RequestExternal()
{
   Firstname = "Bob",
   LastName = "Derp",
   PaymentCards = new List<object>(){null,null,null}
};

var result = JsonConvert.SerializeObject(test, Formatting.Indented);
Console.WriteLine(result);

输出

{
  "Firstname": "Bob",
  "LastName": "Derp",
  "PaymentCards": 3
}

推荐阅读