C# JsonConvert.DeserializeAnonymousType旁路数组
我编写了一个包装器来处理我的应用程序如何与第三方API交互,该API使用泛型反序列化到: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
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)
。我接受这一点作为答案,因为字典
最终就是答案。谢谢