反序列化值总是返回null - RestSharp Get请求
本文关键字:RestSharp Get 请求 null 返回 反序列化 | 更新日期: 2023-09-27 18:10:40
这是我的JSON响应:
{
"-JxpUA1eC_I3miJrdGGs": {
"company": "Microsoft",
"designation": "Chief Executive officer",
"email": "white@microsoft.com",
"name": "Nathan White",
"phone": "51342212333"
},
"-Jy5dki5KkgyxQBuDwNI": {
"bizcardData": {
"company": "Spotify",
"designation": "Designer",
"email": "komarapa@spotify.com",
"name": "Phani Komaravolu",
"phone": "5135921240"
},
"transData": {
"date": "15-08-31",
"location": "39.1395996,-84.5295417",
"tag": "sender",
"time": "22:05:38"
}}
}
我使用RestSharp将其反序列化为:
var resultList = SimpleJson.DeserializeObject<Dictionary<string, SingleCardDetails>>(content);
这是我的SingleCardDetails对象:
public class SingleCardDetails
{
public string Name { get; set; }
public string Company { get; set; }
public string Designation { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
}
我试图使用它来迭代使用:
foreach (var card_details in resultList.Values) {
var name = card_details.Name;
var company = card_details.Company;
var designation = card_details.Designation;
var email = card_details.Email;
var phone = card_details.Phone;
}
但是这里的所有值,如name, company等,都是空的。上面的代码有什么问题?我假设迭代出了问题。请建议代码来解决这个问题。谢谢!
为了将数据反序列化为强类型对象,对象层次结构应该正确匹配。但是,给定的JSON示例看起来像是在根元素下动态生成的一些编码对象。我认为你可以使用动态反序列化来获得嵌套的对象,而不用创建不必要的类型来解析JSON。
为了给你一个解决方案或快速指导。我将使用json.net和ExpandoObject。
我将简单地使用JObject方法解析问题中给出的sample json
。在实际场景中,如果您有这样的对象的数组,那么您可以使用JArray。JObject
解析提供给JObject
的任何字符串json。但是JObject
不能直接转换为ExpandoObject
,所以我在这里使用一个快速修复源。下面是将JObject
转换为ExpandoObject
所需的方法。
public static object ConvertJTokenToObject(JToken token)
{
if (token is JValue)
{
return ((JValue)token).Value;
}
if (token is JObject)
{
ExpandoObject expando = new ExpandoObject();
(from childToken in ((JToken)token) where childToken is JProperty select childToken as JProperty).ToList().ForEach(property =>
{
((IDictionary<string, object>)expando).Add(property.Name, ConvertJTokenToObject(property.Value));
});
return expando;
}
if (token is JArray)
{
object[] array = new object[((JArray)token).Count];
int index = 0;
foreach (JToken arrayItem in ((JArray)token))
{
array[index] = ConvertJTokenToObject(arrayItem);
index++;
}
return array;
}
throw new ArgumentException(string.Format("Unknown token type '{0}'", token.GetType()), "token");
}
}
现在要解析JSON,首先只需调用解析器提供的JSON。
dynamic result = JObject.Parse(JsonDataTest.SampleJson);
var expando = ConvertJTokenToObject(result) as IDictionary<string, object>;
现在您可以看到,我正在将返回的ExpandoObject转换为dictionary。这就是ExpandoObject的实现方式,它为属性和值提供了一个键值存储。每个节点上的所有值都是ExpandoObject类型。
现在查找Expando对象的Store集合中的项。
List<SingleCardDetails> cardDetails = new List<SingleCardDetails>();
foreach (var item in expando)
{
if (item.Value is ExpandoObject)
{
var store = item.Value as IDictionary<string, object>;
// check properties are on first level
if (!store.Keys.Contains("bizcardData"))
{
cardDetails.Add(TryGetData(store));
}
else // check second level where contact details are under bizcardData
{
foreach (var level2 in item.Value as IDictionary<string, object>)
{
if (level2.Value is ExpandoObject)
{
var storeLevel2 = level2.Value as IDictionary<string, object>;
cardDetails.Add(TryGetData(storeLevel2));
}
}
}
}
}
TryGetData()
方法-
private static SingleCardDetails TryGetData(IDictionary<string, object> store)
{
object name;
object company;
object designation;
object email;
object phone;
store.TryGetValue("name", out name);
store.TryGetValue("company", out company);
store.TryGetValue("designation", out designation);
store.TryGetValue("email", out email);
store.TryGetValue("phone", out phone);
return new SingleCardDetails
{
Name = Convert.ToString(name),
Company = Convert.ToString(company),
Email = Convert.ToString(email),
Designation = Convert.ToString(designation),
Phone = Convert.ToString(phone)
};
}
这将解析给定的示例并返回SingleCardDetails
的两个对象。
注意:这不是优化的代码,有很多地方需要改进。但是它应该给你如何解决问题的方向。
。这可以优化为使用递归方法查找项,避免了多个循环和条件语句。尽量优化。