反序列化值总是返回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等,都是空的。上面的代码有什么问题?我假设迭代出了问题。请建议代码来解决这个问题。谢谢!

反序列化值总是返回null - RestSharp Get请求

为了将数据反序列化为强类型对象,对象层次结构应该正确匹配。但是,给定的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的两个对象。

注意:这不是优化的代码,有很多地方需要改进。但是它应该给你如何解决问题的方向。

。这可以优化为使用递归方法查找项,避免了多个循环和条件语句。尽量优化