323

私は 2 日間の大部分をコード サンプルなどで "いじくりまわす" ことに費やしました。非常に大きな JSON ファイルを C# の配列に読み込もうとして、後で処理のために 2D 配列に分割できるようにしました。

私が抱えていた問題は、私がやろうとしていたことをしている人々の例を見つけることができなかったことです. これは、最善を期待してコードを少し編集しただけだったことを意味します。

私は何かをうまく機能させることができました:

  • ファイルを読み取り、ヘッダーを見逃し、値のみを配列に読み取ります。
  • 配列の各行に一定量の値を配置します。(したがって、後で分割して2次元配列に入れることができます)

これは以下のコードで行われましたが、配列に数行入力するとプログラムがクラッシュします。これは、ファイル サイズに関係している可能性があります。

// If the file extension was a jave file the following 
// load method will be use else it will move on to the 
// next else if statement
if (fileExtension == ".json") 
{
    int count = 0;
    int count2 = 0;
    int inOrOut = 0;
    int nRecords=1; 
    JsonTextReader reader = new JsonTextReader(new StreamReader(txtLoaction.Text));
    string[] rawData = new string[5];
    while (reader.Read())
    {
        if (reader.Value != null)
            if (inOrOut == 1)
            {
                if (count == 6)
                {
                    nRecords++;
                    Array.Resize(ref rawData, nRecords);
                    //textBox1.Text += "\r\n";
                    count = 0;
                }
                rawData[count2] += reader.Value + ","; //+"\r\n"
                inOrOut = 0;
                count++;
                if (count2 == 500)
                {
                    MessageBox.Show(rawData[499]);
                }
            }
            else
            {
                inOrOut = 1;
            }
    } 
}

私が使用している JSON のスニペットは次のとおりです。

[ 
    { "millis": "1000", 
      "stamp": "1273010254", 
      "datetime": "2010/5/4 21:57:34", 
      "light": "333", 
      "temp": "78.32", 
      "vcc": "3.54" }, 
] 

この JSON から値が必要です。たとえば、「3.54」が必要ですが、「vcc」を出力したくありません。

JSONファイルを読み込んで必要なデータのみを抽出し、それを配列または後で配列に入れるために使用できるものに入れる方法を誰かが教えてくれることを願っています。

4

12 に答える 12

606

Json.NETですべてを簡単にするのはどうですか?

    public void LoadJson()
    {
        using (StreamReader r = new StreamReader("file.json"))
        {
            string json = r.ReadToEnd();
            List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);
        }
    }

    public class Item
    {
        public int millis;
        public string stamp;
        public DateTime datetime;
        public string light;
        public float temp;
        public float vcc;
    }

クラスdynamicallyを宣言せずに値を取得することもできます。Item

    dynamic array = JsonConvert.DeserializeObject(json);
    foreach(var item in array)
    {
        Console.WriteLine("{0} {1}", item.temp, item.vcc);
    }
于 2012-11-08T21:18:01.757 に答える
48

これを自分で行うのはひどい考えです。Json.NETを使用します。ほとんどのプログラマーが何ヶ月も続けて取り組んだ場合よりも、すでに問題を解決しています。特定のニーズ、配列への解析などについては、ドキュメント、特に を確認してくださいJsonTextReader。基本的に、Json.NET は JSON 配列をネイティブに処理し、それらを文字列、int、またはユーザーからのプロンプトなしでタイプがたまたま何であれ解析します。 これは、リーダーとライターの両方の基本的なコードの使用法への直接リンクです。これを使用して作業することを学習している間、予備のウィンドウで開くことができます

これは最善の方法です。今回は怠惰になり、ライブラリを使用して、この一般的な問題を永遠に解決してください。

于 2012-11-08T20:52:11.757 に答える
14
string jsonFilePath = @"C:\MyFolder\myFile.json";
            
string json = File.ReadAllText(jsonFilePath);
Dictionary<string, object> json_Dictionary = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(json);

foreach (var item in json_Dictionary)
{
    // parse here
}
于 2019-07-05T06:09:23.313 に答える
1

ファイルまたは Web から JSON を取得する簡単な方法があります: Json.Net.Curl

インストールパッケージ Json.Net.Curl

// get JObject from local file system 
var json = Json.Net.Curl.Get(@"data\JObjectUnitTest1.json");
var json = await Json.Net.Curl.GetAsync(@"data\JObjectUnitTest1.json")


// get JObject from Server  
var json = await Json.Net.Curl.GetAsync("http://myserver.com/data.json");

GitHub プロジェクト ナゲット

于 2021-07-11T13:47:39.643 に答える