1

我有一个 JSON 输出,需要将其反序列化为 .NET 对象:

{   "title": "Stock data",
    "raw_data": [
    [
      1088553600000,
      1.3635
    ],
    [
      1091232000000,
      1.3538
    ],
    [
      1093910400000,
      1.3563
    ]]
}

如果我使用 JsonConvert,我应该如何构建我的类以使反序列化有效?

4

2 回答 2

1

如果 raw_data 的类型都是双精度的,那么是这样的:

public class MyClass
{
    public string title { get; set; }
    public List<List<double>> raw_data { get; set; }
}

您可能想查看的酷网站:http: //json2csharp.com/

于 2012-06-12T20:51:28.933 回答
0

对不起,我原来的答案毫无价值,这是一个更好的答案。

您可能遇到了麻烦,因为您将这些类型视为整数和双精度值(对于 C# 程序员来说很自然),但是 Json 对这些类型一无所知,并且仅将数字表示为小数。

正如另一个答案所说,您可以简单地反序列化为双打列表。有趣的是,可以选择将其转换为更自然的表示。

但是,我不建议这样做,因为它在反序列化时并不完全是类型安全的(转换为十进制时原始元素的类型会丢失,您只能假设这种方式可行)!

public class BarArrayConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // Not properly implemented!
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<Bar> bars = new List<Bar>();

        // Read the first token after the start array
        reader.Read();

        // Parse elements of the array
        while (reader.TokenType == JsonToken.StartArray)
        {
            Bar b = new Bar();

            // Convert these as necessary to your internal structure. Note that they are nullable types.
            b.First = reader.ReadAsDecimal();
            b.Second = reader.ReadAsDecimal();


            // Read end array for this element
            reader.Read();
            // Pull off next array in list, or end of list
            reader.Read();

            bars.Add(b);
        }

        return bars;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}


class Bar
{
    public decimal? First;
    public decimal? Second;
}

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

    [JsonConverter(typeof(BarArrayConverter))]
    [JsonProperty("raw_data")]
    public List<Bar> RawData { get; set; }
}

使用十进制类型几乎肯定更明智。我能看到这样做的唯一原因是,如果需要将第一个值保留为整数,这将是一种以更自然的方式限制变量值的方法。

于 2012-06-12T20:50:10.500 回答