在C#中读取和解析Json文件

387
如何在C#中将一个非常大的JSON文件读入一个数组中,以便以后进行分割处理?
我已经设法让以下代码工作:
  • 读取文件
  • 跳过标题只读取值到数组中
  • 将一定数量的值放在数组的每一行中(这样我就可以将其拆分并放入2D数组中)
但是它会在将几行输入到数组后使程序崩溃。这可能与文件大小有关。
// 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文件并仅提取所需的数据以放入数组?


1
当你的程序崩溃时,它会抛出什么异常? - tmesser
1
这个回答解决了你的问题吗?如何使用C#解析JSON? - Heretic Monkey
这个回答解决了你的问题吗?Json.NET能否将数据序列化/反序列化到/自流中? - Liam
13个回答

1

有一种更简单的方式可以从文件或网络获取JSON数据:Json.Net.Curl

安装Json.Net.Curl包:

Install-Package 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项目 Nuget


1
这段代码可以帮助你:


string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

JObject data = JObject.Parse(_filePath );

解析器期望的是 JSON 字符串内容,而不是文件路径。 - Mugen

0

使用Cinchoo ETL,这是一个开源库,解析非常大的JSON文件是迭代和简单易用的。

1. 动态方法: - 不需要POCO类

        string json = @"
[
  {
    ""millis"": ""1000"",
    ""stamp"": ""1273010254"",
    ""datetime"": ""2010/5/4 21:57:34"",
    ""light"": ""333"",
    ""temp"": ""78.32"",
    ""vcc"": ""3.54""
  },
  {
    ""millis"": ""2000"",
    ""stamp"": ""1273010254"",
    ""datetime"": ""2010/5/4 21:57:34"",
    ""light"": ""333"",
    ""temp"": ""78.32"",
    ""vcc"": ""3.54""
  }
] 
";
        
        using (var r = ChoJSONReader.LoadText(json))
        {
            foreach (var rec in r)
                Console.WriteLine(rec.Dump());
        }

示例代码片段:https://dotnetfiddle.net/mo1qvw

2. POCO 方法:

定义匹配 JSON 属性的 POCO 类

public class Item
{
    public int Millis { get; set; }
    public string Stamp { get; set; }
    public DateTime Datetime { get; set; }
    public string Light { get; set; }
    public float Temp { get; set; }
    public float Vcc { get; set; }
}

然后使用解析器将JSON加载如下

        string json = @"
[
  {
    ""millis"": ""1000"",
    ""stamp"": ""1273010254"",
    ""datetime"": ""2010/5/4 21:57:34"",
    ""light"": ""333"",
    ""temp"": ""78.32"",
    ""vcc"": ""3.54""
  },
  {
    ""millis"": ""2000"",
    ""stamp"": ""1273010254"",
    ""datetime"": ""2010/5/4 21:57:34"",
    ""light"": ""333"",
    ""temp"": ""78.32"",
    ""vcc"": ""3.54""
  }
] 
";
        
        using (var r = ChoJSONReader<Item>.LoadText(json))
        {
            foreach (var rec in r)
                Console.WriteLine(ChoUtility.Dump(rec));
        }

示例代码片段:https://dotnetfiddle.net/fRWu0w

免责声明:本库的作者是我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接