【问题标题】:Deserialize JSON in c# when the return dataset in not known当返回数据集未知时,在 C# 中反序列化 JSON
【发布时间】:2016-06-22 18:00:41
【问题描述】:

我正在处理人口普查数据,我的 json 网址是:

http://api.census.gov/data.json

从上面的 json 中,我想构建“标题”的下拉列表,其中“c_dataset”有“acs5”。现在我的 MVC 控制器中的代码如下:

var yourObject = new JavaScriptSerializer().Deserialize<dynamic>(result.ToString());

            foreach (KeyValuePair<string, object> currency in yourObject)
            {
                if (currency.Key == "dataset")
                {
                    foreach (KeyValuePair<string, object> cur in currency.Value)
                    {

                    }
                }
            }

最里面的foreach给了我一个错误,“foreach语句不能对变量类型'object'进行操作,因为'object'不包含'GetEnumerator'的公共定义!!我不能反序列化某个类中的对象,因为这个 json 很大。最好的方法是什么?另外,我想知道是否可以使用 LINQ 查询反序列化对象。提前谢谢。

【问题讨论】:

  • 448kb 并没有那么大。当您尝试将其反序列化为具体类型时会发生什么?
  • @JLRishe 我的意思是制作类的大结构,我只想反序列化它以从中创建下拉菜单。我们如何将反序列化为具体类型?

标签: c# json linq asp.net-mvc-4 serialization


【解决方案1】:

我认为您最好的选择是构建仅具有您想要的属性的具体类型,而忽略其他所有内容。 JSON 反序列化器将忽略额外的“噪音”,只读取您指定的属性。

// not tested
class CensusDataSet
{
    [JsonProperty("c_dataset")]
    public string[] CDataset { get; set; }

    [JsonProperty("title")]
    public string Title { get; set; }
}

class CensusData
{

    [JsonProperty("dataset")]
    public CensusDataSet[] DataSets { get; set; }
}

...
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<CensusData>(content);

foreach (var dataSet in data.DataSets) ...

顺便说一句,您的标题具有误导性:您尝试执行的操作称为 deserialize。

【讨论】:

  • 哇,太棒了,最适合我!我不知道这种方式。感谢您提供此解决方案。
  • 我还想添加 AccessURL,所以我在 CensusDataSet 中添加了,但它在反序列化中为空。可能是什么原因?
  • 那是因为 accessURL 不是 CensusDataSet 的属性。它存在于属性“分布”中,这是一个记录数组。您必须在您的类型中模仿这种层次结构,您不能指望反序列化器为您解决这个问题。您需要创建class Distribution { public string AccessUrl { get; set; }},然后将字段Distribution[] Distributions 添加到CensusDataSet。不要忘记正确的JsonProperty(name) 属性。完成后,您将获得 accessURL 作为 dataSet.Distributions[0].AccessUrl.
  • 你知道有什么方法(动态)我们可以在不创建泛型类的情况下解析 json 吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多