Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JsonConvert.DeserializeAnonymousType旁路数组_C#_Json.net - Fatal编程技术网

C# JsonConvert.DeserializeAnonymousType旁路数组

C# JsonConvert.DeserializeAnonymousType旁路数组,c#,json.net,C#,Json.net,我编写了一个包装器来处理我的应用程序如何与第三方API交互,该API使用泛型反序列化到: protected static async Task<TResult> Get<TResult, TApiModel>(string url, Dictionary<string, string> additionalHeaders = null) where TResult : IBaseModel, new() where TApiM

我编写了一个包装器来处理我的应用程序如何与第三方API交互,该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": "...",
}]

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

我遇到了数据模型被包装在一个附加对象中的问题,如您的示例中所示。对我来说,一个只做了相当小的改动的解决方案是在字典中包装TModel类

因此,您在这里的行将变成:

var deserializedObjectDictionary = JsonConvert.DeserializeAnonymousType(data, new Dictionary<string, List<TApiModel>>());
// now unwrap dictionary to extract object
var deserializedObjectDictionary=JsonConvert.DeserializeAnonymousType(数据,new Dictionary());
//现在展开字典以提取对象

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

我遇到过这样的问题,即数据模型被包装在一个添加对象中,如您的示例中所示。对我来说,一个只做了相当小的改动的解决方案是在字典中包装TModel类

因此,您在这里的行将变成:

var deserializedObjectDictionary = JsonConvert.DeserializeAnonymousType(data, new Dictionary<string, List<TApiModel>>());
// now unwrap dictionary to extract object
var deserializedObjectDictionary=JsonConvert.DeserializeAnonymousType(数据,new Dictionary());
//现在展开字典以提取对象

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

我最终意识到,现在我得到了一个
字典,我可以使用
GetValueOrDefault('data')
从该键显式获取我需要的值:

var model = JsonConvert.DeserializeObject<Dictionary<string, List<TApiModel>>>(data).GetValueOrDefault("data").FirstOrDefault().ConvertToBaseModel();
var model=JsonConvert.DeserializeObject(数据).GetValueOrDefault(“数据”).FirstOrDefault().ConvertToBaseModel();

我最终意识到,现在我得到了一个
字典
,我可以使用
GetValueOrDefault('data')
从该键显式获取我需要的值:

var model = JsonConvert.DeserializeObject<Dictionary<string, List<TApiModel>>>(data).GetValueOrDefault("data").FirstOrDefault().ConvertToBaseModel();
var model=JsonConvert.DeserializeObject(数据).GetValueOrDefault(“数据”).FirstOrDefault().ConvertToBaseModel();

当您的类型不是匿名类型时,为什么要使用
反序列化匿名类型
?尝试
返回反序列化对象(数据)?.FirstOrDefault()?.ConvertToBaseModel()
@ZoharPeled首先,是的,我不应该使用
匿名类型
-谢谢你,我不知道我能做到。不幸的是,我在尝试您的建议时遇到了一个错误,因为TApiModel数组位于响应中的属性“data”下
“无法将当前JSON对象反序列化为类型…因为该类型需要JSON数组”
这就像我需要执行
JsonConvert.DeserializeObject(data.Select(d=>d.data)).FirstOrDefault().ConvertToBaseModel()
但显然我不能,因为此时数据是字符串。想法?很抱歉,我一开始就错过了
数据:
(顺便说一句,这是
“数据”:
,但这只是吹毛求疵…)在这种情况下,你可以在你的类型中反映出来,或者使用ekke的答案,或者
反序列化对象…
这些方法中的任何一种都可以很好地工作。谢谢@zoharpeld,它现在正在使用这种类型。干杯。当您的类型不是匿名类型时,为什么要使用反序列化匿名类型?尝试
返回反序列化对象(数据)?.FirstOrDefault()?.ConvertToBaseModel()
@ZoharPeled首先,是的,我不应该使用
匿名类型
-谢谢你,我不知道我能做到。不幸的是,我在尝试您的建议时遇到了一个错误,因为TApiModel数组位于响应中的属性“data”下
“无法将当前JSON对象反序列化为类型…因为该类型需要JSON数组”
这就像我需要执行
JsonConvert.DeserializeObject(data.Select(d=>d.data)).FirstOrDefault().ConvertToBaseModel()
但显然我不能,因为此时数据是字符串。想法?很抱歉,我一开始就错过了
数据:
(顺便说一句,这是
“数据”:
,但这只是吹毛求疵…)在这种情况下,你可以在你的类型中反映出来,或者使用ekke的答案,或者
反序列化对象…
这些方法中的任何一种都可以很好地工作。谢谢@zoharpeld,它现在正在使用这种类型。干杯。我最终选择了Zohar在评论中建议的
JsonConvert.DeserializeObject(data)
。我接受这一点作为答案,因为
字典
最终就是答案。谢谢。我最终选择了Zohar在评论中建议的
JsonConvert.DeserializeObject(data)
。我接受这一点作为答案,因为
字典
最终就是答案。谢谢