如何在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文件,只提取需要放入数组的数据?


当前回答

有一种更快的解析json的方法。网如果你使用的是。net core 3.0或更高版本,那么你可以使用System.Text.Json nuget包来序列化或反序列化。

您需要补充:

using System.Text.Json

然后你可以序列化为:

var jsonStr = JsonSerializer.Serialize(model);

反序列化为:

var model = JsonSerializer.Deserialize(jsonStr);

其他回答

为我找到了正确的道路

   var pathToJson = Path.Combine("my","path","config","default.Business.Area.json");
   var r = new StreamReader(pathToJson);
   var myJson = r.ReadToEnd();

   // my/path/config/default.Business.Area.json 
   [...] do parsing here 

路径。Combine使用路径。它检查第一个路径的末尾是否已经有分隔符,这样它就不会复制分隔符。此外,它还检查要组合的路径元素是否具有无效字符。

参见https://stackoverflow.com/a/32071002/4420355

.NET核心的答案

你可以使用内置的System.Text.Json而不是第三方的Json.NET。为了促进重用,json文件读取功能属于自己的类,应该是泛型的,而不是硬编码为某种类型(Item)。下面是一个完整的例子:

using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

namespace Project
{
    class Program
    {
        static async Task Main()
        {
            Item item = await JsonFileReader.ReadAsync<Item>(@"C:\myFile.json");
        }
    }

    public static class JsonFileReader
    {
        public static async Task<T> ReadAsync<T>(string filePath)
        {
            using FileStream stream = File.OpenRead(filePath);
            return await JsonSerializer.DeserializeAsync<T>(stream);
        }
    }

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

或者,如果你更喜欢简单的/同步的:

class Program
{
    static void Main()
    {
        Item item = JsonFileReader.Read<Item>(@"C:\myFile.json");
    }
}

public static class JsonFileReader
{
    public static T Read<T>(string filePath)
    {
        string text = File.ReadAllText(filePath);
        return JsonSerializer.Deserialize<T>(text);
    }
}

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

您甚至可以在不声明Item类的情况下动态地获取值。

    dynamic array = JsonConvert.DeserializeObject(json);
    foreach(var item in array)
    {
        Console.WriteLine("{0} {1}", item.temp, item.vcc);
    }

有一种更快的解析json的方法。网如果你使用的是。net core 3.0或更高版本,那么你可以使用System.Text.Json nuget包来序列化或反序列化。

您需要补充:

using System.Text.Json

然后你可以序列化为:

var jsonStr = JsonSerializer.Serialize(model);

反序列化为:

var model = JsonSerializer.Deserialize(jsonStr);

基于@ l.b.。的解决方案,(类型为对象而不是匿名)VB代码是

Dim oJson As Object = JsonConvert.DeserializeObject(File.ReadAllText(MyFilePath))

我应该提到,对于构造不需要类型的HTTP调用内容,这是快速且有用的。使用对象而不是匿名意味着你可以在Visual Studio环境中保持Option Strict On -我讨厌关闭它。