0

次の Json レスポンスを受け取りました。

{"time_series_data":"[[2013-07-23T09:45:00,0.991],[2013-07-23T10:00:00,1.047],[2013-07-23T10:15:00,0.069],[ 2013-07-23T10:30:00,1.001],[2013-07-23T10:45:00,0.947],[2013-07-23T11:00:00,0.278],[2013-07-23T11:15: 00,0.48],[2013-07-23T11:30:00,0.709],[2013-07-23T11:45:00,1.315],[2013-07-23T12:00:00,0.89],[2013- 07-23T12:15:00,0.31],[2013-07-23T12:30:00,0.121],[2013-07-23T12:45:00,0.593],[2013-07-23T13:00:00, 0.513]、[2013-07-23T13:15:00、0.222]、[2013-07-23T13:30:00、1.759]、[2013-07-23T13:45:00、1.715]、[2013-07- 23T14:00:00,1.439],[2013-07-23T14:15:00,0.448],[2013-07-23T14:30:00,0.105]]"}

これらの日付と double をリストに読み込むにはどうすればよいですか?

Json.net を使用してみましたが、上記の値のコレクションが何と呼ばれているのかよくわかりません。次のコードを使用すると、[[ と ]] の間の値を取得できますが、ここから先に進む方法がわかりません。

JsonTextReader jR = new JsonTextReader(new StringReader(WebApiURL));

string data = "";

while (jR.Read())
{
    if (jR.Value != null && jR.Value != "time_series_data")
    data = jR.Value.ToString();
}

Json.net またはネイティブ C# で作業できます。提案?

4

2 に答える 2

1

http://json2csharp.com/を使用して VALID json のオブジェクトの構造を取得し、Json.net ライブラリを使用してそれらを解析できます。

于 2013-07-23T22:18:03.350 に答える
1

取得している JSON 応答は全体として有効な JSON ですが、標準の JSON ライブラリを使用して日付と小数を簡単に抽出できる形式ではありません。

最初の問題は、「配列」部分が実際には文字列値の中にあることです。単純に文字列値を取得して JSON として再解析できると考えるかもしれませんが、別の問題に直面することになります。@Blender が気付いたように、文字列値自体は有効な JSON 配列ではありません。JSON にはネイティブの日付表現がないため、日付値を有効にするには、日付値を引用符で囲む必要があります。

したがって、何らかの方法で、データを手動で処理して値を抽出する必要があります。幸いなことに、正規表現を使用して文字列を分割することはそれほど難しくありません。これが私がとるアプローチです:

まず、データ項目を保持する単純なクラスを定義します。

class DataItem
{
    public DateTime Date { get; set; }
    public double Number { get; set; }
}

data次に、中断したところから始めて、次のように文字列を分解できます。

List<DataItem> timeSeriesData = new List<DataItem>();
string[] pairs = Regex.Split(data, @"\[\[|\],\[|\]\]");
foreach (string pair in pairs)
{
    if (!string.IsNullOrEmpty(pair) && char.IsDigit(pair[0]))   // sanity check
    {
        string[] parts = pair.Split(',');
        DateTime date = DateTime.Parse(parts[0], CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
        double number = double.Parse(parts[1]);
        timeSeriesData.Add(new DataItem { Date = date, Number = number });
    }
}

timeSeriesDataこれで、必要に応じてリストを使用できます。

于 2013-07-24T00:14:33.470 に答える