1

.NET オブジェクトに逆シリアル化する必要がある JSON 出力があります。

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

JsonConvert を使用している場合、逆シリアル化が機能するようにクラスをどのように構成すればよいですか?

4

2 に答える 2

1

raw_data の型が両方とも double の場合、次のようになります。

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

申し訳ありませんが、私の元の回答は価値がありませんでした。より良い回答があります。

これらの型を整数値と double 値 (C# プログラマーにとっては当然のこと) と見なしたため、おそらく問題に遭遇しましたが、Json はこれらの型について何も知らず、数値を単純に 10 進数として表します。

別の答えが言ったように、ダブルのリストのリストとして単純に逆シリアル化できます。興味深いことに、より自然な表現に変換するオプションがあります。

ただし、逆シリアル化するときに正確にタイプセーフではないため、これはお勧めしません (10 進数に変換すると元の要素の型が失われます。この方法が機能すると想定することしかできません)。

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; }
}

ほとんどの場合、10 進数型を使用する方が賢明です。これを行う唯一の理由は、最初の値を整数のままにしておく必要がある場合、これはより自然な方法で変数の値を制限する方法になるということです。

于 2012-06-12T20:50:10.500 に答える