反序列化Json字符串类型未知

本文关键字:未知 类型 字符串 Json 反序列化 | 更新日期: 2023-09-27 17:58:27

我有如下JSON:

   {
 "request" :
 {
  "command" : "series",
  "series_id" : "PET.WCRSTUS1.W"
 },
 "series" : [
  {
   "series_id" : "PET.WCRSTUS1.W",
   "name" : "U.S. Ending Stocks of Crude Oil, Weekly",
   "units" : "Thousand Barrels",
   "f" : "W",
   "unitsshort" : "Mbbl",
   "description" : "U.S. Ending Stocks of Crude Oil",
   "copyright" : "None",
   "source" : "EIA, U.S. Energy Information Administration",
   "iso3166" : "USA",
   "geography" : "USA",
   "start" : "19820820",
   "end" : "20160715",
   "updated" : "2016-07-20T13:18:37-0400",
   "data" : [["20160715", 1214561], 
   ["20160708", 1216904], 
   ["20160701", 1219452], 
   ["20160624", 1221677], 
   ["20160617", 1225730], 
   ["20160610", 1226647], 
   ["20160603", 1227580]]
  }
 ]
}

我使用了一个在线JSON转换器来生成C#,如下所示:

public class Request
{
    public string command { get; set; }
    public string series_id { get; set; }
}
public class Series
{
    public string series_id { get; set; }
    public string name { get; set; }
    public string units { get; set; }
    public string f { get; set; }
    public string unitsshort { get; set; }
    public string description { get; set; }
    public string copyright { get; set; }
    public string source { get; set; }
    public string iso3166 { get; set; }
    public string geography { get; set; }
    public string start { get; set; }
    public string end { get; set; }
    public string updated { get; set; }
    public List<List<Object>> data { get; set; }
}

public class RootObject
{
    public Request request { get; set; }
    public List<Series> series { get; set; }
}

现在,请注意"Series"的"data"属性是List of List。我想做的是创建一个类来表示这些:

public class DataItem
{
    public string Date { get; set; }
    public int Value { get; set; }
}

然后修改系列类别如下:

public class Series
{
    public string series_id { get; set; }
    public string name { get; set; }
    public string units { get; set; }
    public string f { get; set; }
    public string unitsshort { get; set; }
    public string description { get; set; }
    public string copyright { get; set; }
    public string source { get; set; }
    public string iso3166 { get; set; }
    public string geography { get; set; }
    public string start { get; set; }
    public string end { get; set; }
    public string updated { get; set; }
    public List<DataItem> data { get; set; }
}

当我这样做时,我会在数据属性中获得正确数量的项,但每个单独的DataItem都有默认值(空字符串和0表示值)。请有人建议如何(如果)实现这一目标。

我的反序列化正在使用System。运行时。序列化(不是Json.Net)。反序列化例程可以被认为是我无法控制的。不确定这是否相关,但下面的片段:

    public static T FromJsonString<T>(string json, Type[] extraTypes = null)
    {
        T result;
        var serializer = new DataContractJsonSerializer(typeof(T), extraTypes ?? new Type[] { });
        using (var stream = new MemoryStream())
        {
            using (var writer = new StreamWriter(stream))
            {
                writer.Write(json);
                writer.Flush();
                stream.Position = 0;
                result = (T) serializer.ReadObject(stream);
            }
        }
        return result;
    }

综上所述:

  • 如何将要反序列化到DataItem类的数据对象列表?JSON中未表示该类型

我正在使用。Net 4.0。

希望这是清楚的——如果不是,请发表评论。

反序列化Json字符串类型未知

如果不能更改传入的json,我认为您必须同时拥有以下两个属性:

public List<List<Object>> Data { get; set; }
public List<DataItem> DataMapped { get; set; }

反序列化为"data"属性,然后有一个映射函数,该函数将从data映射到dataMapped

例如

//deserialize here, then...
for (int i = 0; i < Data.Count; i++)
{
    DataMapped.Add(new DataItem() { Date = Data[i][0].ToString(), Value = int.Parse(Data[i][1].ToString()) });
}

这里没有检查期望值,所以您可能需要添加它——例如,内部列表肯定包含2个对象等。

如果您查看json,尤其是

     "data" : [["20160715", 1214561], 
   ["20160708", 1216904], 
   ["20160701", 1219452], 
   ["20160624", 1221677], 
   ["20160617", 1225730], 
   ["20160610", 1226647], 
   ["20160603", 1227580]]

Data是Array of Arrays,因此您使用的在线生成器已正确地将json转换为public List<List<Object>> data { get; set; }

但是,您稍后可以通过简单地迭代public List<List<Object>> data { get; set; }并为每个内部列表创建一个DataItem来将其映射到public List<DataItem> data { get; set; }