代码之家  ›  专栏  ›  技术社区  ›  Zze

JsonConvert.DeserializeAnonymousType旁路阵列

  •  0
  • Zze  · 技术社区  · 5 年前

    我编写了一个包装器来处理我的应用程序如何与使用泛型反序列化的第三方API交互:

    protected static async Task<TResult> Get<TResult, TApiModel>(string url, Dictionary<string, string> additionalHeaders = null)
            where TResult : IBaseModel, new()
            where TApiModel : IBaseApiResult<TResult>, new()
    {
        var response = await HttpClient.SendAsync(requestMessage).ConfigureAwait(false);
        ...
        var data = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    
        try
        {
            var deserializedObject = JsonConvert.DeserializeAnonymousType(data, new TApiModel());
            var model = deserializedObject.ConvertToBaseModel();
            return model;
        }
        catch { ... }
    }
    

    我最初使用的版本返回了一个“平面”对象,结果如下:

    {
        "_id": 44322889,
        "bio": "...",
        "created_at": "2013-06-03T19:12:02Z",
        "display_name": "...",
    }
    

    该版本最近已被弃用,新版本现在返回数据数组中包装的所有响应,即使是对于这样的单个响应:

    data: [{
        "_id": 44322889,
        "bio": "...",
        "created_at": "2013-06-03T19:12:02Z",
        "display_name": "...",
    }]
    

    有没有一种方法可以更新我的上述反序列化代码,这样我就不必更新所有使用它的类了?

    1 回复  |  直到 5 年前
        1
  •  2
  •   ekke    5 年前

    我曾经遇到过这样的问题:数据模型被包装在一个addition对象中,就像在您的例子中一样。一个对我有效的解决方案是在字典中包装TModel类。

    var deserializedObjectDictionary = JsonConvert.DeserializeAnonymousType(data, new Dictionary<string, List<TApiModel>>());
    // now unwrap dictionary to extract object
    

    这有点不雅观,但如果您不想添加额外的模型类,这通常是最好的解决方案。