【问题标题】:Serializing a JSON array to an instance of a class将 JSON 数组序列化为类的实例
【发布时间】:2012-06-05 02:15:39
【问题描述】:

如果我有 JSON 数据,例如:

{
"datapoints":[ [null, 1234567890, "point1"], [null, 1234567890, "point2"] ]
}

有没有办法将该数据反序列化为以下类:

public class Result 
{
    public DataPoint[] DataPoints {get;set;}
}

public class DataPoint
{
   public string Name {get;set;}
   public string Value {get;set;}
   public DateTime Timestamp {get;set;}
}

我可以指定将哪个数组成员的索引序列化到哪个属性中吗?

【问题讨论】:

    标签: c# json serialization


    【解决方案1】:

    如果您愿意使用 Json.Net 进行一些自定义反序列化

    string json = @"{""datapoints"":[ [null, 1234567890, ""point1""], [null, 1234567890, ""point2""] ]}";
    var result = (JObject)JsonConvert.DeserializeObject(json);
    var dataPoints = result["datapoints"]
                .Select(t => new DataPoint() 
                 {
                    Timestamp = String.IsNullOrEmpty(t[0].ToString()) ? DateTime.MinValue : DateTime.Parse(t[0].ToString()),
                    Value = t[1].ToString(),
                    Name= t[2].ToString()
                 })
                .ToArray();
    

    PS:Timestamp 可能需要更多工作,具体取决于格式。

    【讨论】:

    • 这几乎就是我现在正在做的事情。我只是想知道是否有更直接的方法来反序列化而不是需要再次枚举列表来解析数组值。
    【解决方案2】:

    很难准确地说,因为您没有指定如何反序列化数据。

    如果可以使用外部库,我建议使用 Json.Net - 它比 System.Web.Script.Serialization.JavaScriptSerializer 更好用。

    编辑以解决(非常有效!)问题 - 正如 elsewhere on SO 所提到的,如果您包含 Json.Net,您可以说 JArray a = JArray.Parse(datapoints); 来加载您的数组,然后您可以手动 @987654324 @ up new DataPoints 为每个新数组项,并用来自预期槽的值填充它。我不知道你可以用它来装饰你的类属性的属性会使它更漂亮。您可能会使用它的 Linq to Json 来让这件事变得不那么丑陋。

    【讨论】:

    • 我愿意接受建议。目前,我使用的是DataContractJsonSerializer(不同于JavaScripSerializer)。
    • “使用外部库”真的不是答案。
    • 根据您的编辑,我也可以只使用DataContractJsonSerializer 将数据解析为object[],而不添加 Json.Net 的依赖关系或学习曲线。我想知道是否可以在数组和我的类之间直接转换。
    • @scottm - 能够以同样的方式使用 DataContractJsonSerializer 非常正确 - 您可以使用它进入中间多维字符串数组阶段,然后从那里使用 Linq实例化一堆新对象。我只是想我会提到 Json.Net,因为 JavaScriptSerializer 有,嗯,角色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多