【问题标题】:Can't get data from deserialized Json string无法从反序列化的 Json 字符串中获取数据
【发布时间】:2014-10-08 07:11:33
【问题描述】:

我真的很困惑为什么我无法访问我从Json 字符串反序列化的任何数据。当我逐步完成该过程时,我可以看到数据在那里,但我无法访问它。

我将数据放入Dictionary<string, object>,它的Count 为2。它包含object{object[]}(我将其读作objectsArrayList?)和一个带有响应信息的object

对于访问ArrayList 中的对象所需的响应信息,我并不太在意。我没有这样的运气,我的代码如下:

var output = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(await response.Content.ReadAsStringAsync());

我尝试使用output["List"](列表是对象键)仅获取ArrayList,并且仍然可以看到里面的所有对象,但仍然无法访问它们。这可能是一个简单的解决方法,总是如此,但我整天都在盯着这个问题,只是无法理解它,所以可以用另一双眼睛来解决。

谢谢

编辑

Json 字符串格式如下:

{"List":[{"Id":1,"intProperty":2,"boolProperty":false},{"Id":2,"intProperty":3,"boolProperty":false},{"Id":4,"intProperty":5,"boolProperty":false}],"ResponseInformation":{Other info here}}

【问题讨论】:

  • 你能显示你正在使用的 JSON 字符串吗?
  • 现在已经完成,在我发布后才意识到.. 已经取出数据,但我猜这并不重要
  • 您是否尝试过反序列化为Dictionary<string, object[]>
  • 我已经尝试过Dictionary<string[], object> 但不是那样...我会尝试...
  • InnerException {"No parameterless constructor defined for type of 'System.Object[]'."} System.Exception {System.MissingMethodException} 不 :(

标签: c# json api serialization arraylist


【解决方案1】:

只用了两行就搞定了!!

var json = response.Content.ReadAsStringAsync().Result;

IList<Currency> output = new JsonSerializer().Deserialize<IList<Currency>>(new JsonTextReader(new StringReader(json)));

【讨论】:

    【解决方案2】:

    我想出了一种获取所需信息的冗长方法,如果有人能看到压缩代码的方法,我愿意接受建议:) 首先,我创建了 Currency 类

    public class Currency
    {
        public int CurrencyId { get; set; }
        public int GlobalCurrencyId { get; set; }
        public bool Archived { get; set; }
    }
    

    接下来我像在我的问题中那样反序列化我的 Json

    var output = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(await response.Content.ReadAsStringAsync());

    接下来是长篇大论;我使用了一个 foreach 语句来获取我的 output 变量的每个元素。然后明确了里面的数据是一个字典对象数组,所以我创建了一个 Currency 类对象的列表:

    var currencyObject = output["List"];
    
    List<Currency> currencyList = new List<Currency>();
    Currency item;
    
    ArrayList myList = currencyObject as ArrayList;
    foreach (object element in myList)
    {
        Dictionary<string, object> L1 = element as Dictionary<string, object>;
    
        item = new Currency();
        item.CurrencyId = Convert.ToInt32(L1["CurrencyId"]);
        item.GlobalCurrencyId = Convert.ToInt32(L1["GlobalCurrencyId"]);
        item.Archived = Convert.ToBoolean(L1["Archived"]);
    
        currencyList.Add(item);
    }
    

    【讨论】:

      【解决方案3】:

      反序列化成一个类:

      public class ListClass
      {
          public int Id;
          public int IntProperty;
          public bool boolProperty;
      }
      

      然后

      var output = new JavaScriptSerializer().Deserialize<Dictionary<string, ListClass>>(await response.Content.ReadAsStringAsync());
      

      这应该行得通!

      【讨论】:

      • 太糟糕了...但无论如何,至少这对有所帮助。哈哈!谢谢你的提问!这对我来说也是一次学习经历。
      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多