如何反序列化具有相同名称但不同类型的 API 响应

Posted

技术标签:

【中文标题】如何反序列化具有相同名称但不同类型的 API 响应【英文标题】:How to deserialize an API response with the same name but different type 【发布时间】:2021-01-19 05:28:11 【问题描述】:

我在反序列化 API 响应时遇到问题。响应返回一个对象。该对象中的属性之一可以是布尔值或对象。在 C# 中对其进行反序列化时,出现反序列化错误。如何区分这两种数据类型?

反序列化器:

JsonSerializer.Deserialize<IEnumerable<ApiResponse>>(response)

ApiResponse 对象:

public class ApiResponse

  [JsonPropertyName("site")]
  public bool SiteBool  get; set; 
    
  [JsonPropertyName("site")]
  public SiteObject Site  get; set; 

    
public class SiteObject

  [JsonPropertyName("id")]
  public string Id  get; set; 

  [JsonPropertyName("url")]
  public string Url  get; set; 

【问题讨论】:

使用objectdynamic。 C# 没有联合类型,因此您只需选择一个上限类型 你得到什么错误? @AluanHaddad 使用动态似乎可以否定反序列化错误! @devNull InvalidOperationException:“ApiResonse.SiteObject”的 JSON 属性名称与另一个属性冲突。 您只需创建一个属性并删除另一个属性 【参考方案1】:

为此,您需要使用JsonConverter,类会是这样的:

public class ApiResponse

  [JsonPropertyName("site")]
  [JsonConverter(typeof(SiteJsonConverter))]
  public ISite Site  get; set; 
   

    

public class IsSite : ISite

  public bool Value  get; set; 


public class SiteObject : ISite

  public string Id  get; set; 

  public string Url  get; set; 


和这样的转换器,但要正确实现转换器我建议你阅读https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to

public class SiteJsonConverter : JsonConverter<ISite>

    public override ISite Read(ref Utf8JsonReader reader,
            Type typeToConvert,
            JsonSerializerOptions options)
    
       //Add conversion code here 
    

    public override void Write(Utf8JsonWriter writer,
            DateTimeOffset dateTimeValue,
            JsonSerializerOptions options)
    
        throw new NotImplementedException();
    

此代码只是一个展示想法的示例,您需要根据需要对其进行调整

【讨论】:

以上是关于如何反序列化具有相同名称但不同类型的 API 响应的主要内容,如果未能解决你的问题,请参考以下文章

使用Jackson在android中反序列化具有相同键但不同类型的json

反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣

如何将不同名称的 XML 节点反序列化为相同的基本类型

使用变量名数组反序列化 JSON

如何使用json.net自定义反序列化为对象

如何将具有不同值的相同 JSON 对象反序列化为 java 类