处理古怪的 API JSON 响应体 --- 单例与数组 [重复]

Posted

技术标签:

【中文标题】处理古怪的 API JSON 响应体 --- 单例与数组 [重复]【英文标题】:Handling quirky API JSON response body --- singleton versus array [duplicate] 【发布时间】:2021-04-07 03:32:36 【问题描述】:

所以我的 API 服务提供商的 JSON 响应正文元素不一致。具体来说,可以包含一条或多条记录的属性并不总是作为数组传回。如果有多个记录,它是。但如果只有一条记录,则该记录将作为单例传回。

我希望在我的 C# 应用程序中以编程方式将 [ ] 附加到单例记录周围,以便将其正确定义为具有单个元素的数组。更多的是正则表达式实验,因为我将 JSON 响应正文作为字符串处理。我知道它可能效率较低,但 JSON 字符串是第三方“黑匣子”正在寻找的。​​p>

单例 JSON 响应正文示例。


   "Transfer":
      "transferID":"3581",
      "sent":"true",
      "received":"true"
   

现在是数组 JSON 主体的示例。


   "Transfer":[
      
         "transferID":"3581",
         "sent":"true",
         "received":"true"
      ,
      
         "transferID":"3582",
         "sent":"true",
         "received":"true"
      
   ]

只是寻找在单例 Transfer 记录周围添加 [ 和 ] 的最快和最干净的方法。想要一个可重用的方法,因为 API 服务提供者也以这种方式传回其他记录类型。

【问题讨论】:

首先,我非常强烈建议修复 API 以提供结构良好的响应,并修复或丢弃所有需要这种破坏行为的第 3 方黑匣子。如果这不是一个选项,我仍然不会为此使用正则表达式 - 你最终会遇到比你开始时更多的问题。相反,我会尝试将其序列化为数组版本,如果失败,则将其序列化为单对象(not 单例)版本。 或者,this question 可能会提供解决方案- Franz,您提供的链接非常有效。希望我可以控制对该项目施加的限制。但这作为一种解决方法效果很好。谢谢! 【参考方案1】:

显然这里描述了处理不一致的最直观的方法 --> How to handle both a single item and an array for the same property using JSON.net。

具体来说,这里是提供所需功能的 C# 类。

class SingleOrArrayConverter<T> : JsonConverter

    public override bool CanConvert(Type objectType)
    
        return (objectType == typeof(List<T>));
    

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        
            return token.ToObject<List<T>>();
        
        return new List<T>  token.ToObject<T>() ;
    

    public override bool CanWrite
    
        get  return false; 
    

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    
        throw new NotImplementedException();
    

【讨论】:

以上是关于处理古怪的 API JSON 响应体 --- 单例与数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

测试 Postman 响应体 Json 是数组还是对象

fastapi教程翻译(四):Request Body(请求体)

无法使用 AFNetworking 3 为 JSON 和 XML 响应创建单例

覆盖 fastAPI 的 HTTPException 响应体

在 PHP 中处理 JSON API 响应以将数据存储为变量

fetch 给出一个空的响应体