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

我花了两天的时间在代码示例等方面,试图将一个非常大的JSON文件读入c#中的数组,这样我就可以稍后将其分割成一个2d数组进行处理。

我遇到的问题是,我找不到任何做我想做的事情的人的例子。这意味着我只是稍微编辑了一下代码,抱着最好的希望。

我已经设法得到一些工作,将:

  • 读取文件忽略头文件,只将值读入数组。
  • 在数组的每行上放置一定数量的值。(所以我 以后可以把它分割成一个放入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文件,只提取我需要的数据,并把它放入一个数组或我可以用来以后放入数组的东西。

966915 次浏览

自己做这件事是个糟糕的主意。使用Json。网。它已经比大多数程序员更好地解决了这个问题,如果给他们几个月的时间来解决这个问题。至于你的特定需求,解析成数组等,检查文档,特别是在JsonTextReader。基本上,Json。NET原生处理JSON数组,并将它们解析为字符串、int或任何恰好不需要您提示的类型。在这里是读者和作者的基本代码用法的直接链接,所以当你学习使用它时,你可以在一个空闲窗口中打开它。

这是最好的:这次偷懒,使用一个库,这样你就解决了这个常见的问题直到永远。

Json。网让一切变得更简单怎么样?

    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类的情况下获得值dynamically

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

为我找到了正确的道路

   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

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

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

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

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
}

对于任何JSON解析,使用网站http://json2csharp.com/(最简单的方法)将您的JSON转换为c#类,反序列化您的JSON为c#对象。

 public class JSONClass
{
public string name { get; set; }
public string url { get; set; }
public bool visibility { get; set; }
public string idField { get; set; }
public bool defaultEvents { get; set; }
public string type { get; set; }
}

然后使用JavaScriptSerializer(来自System.Web.Script.Serialization),以防你不需要任何像newtonsoft这样的第三方DLL。

using (StreamReader r = new StreamReader("jsonfile.json"))
{
string json = r.ReadToEnd();
JavaScriptSerializer jss = new JavaScriptSerializer();
var Items = jss.Deserialize<JSONClass>(json);
}

然后你可以用Items.name或Items获取你的对象。Url等等。

这也可以通过以下方式来实现:

JObject data = JObject.Parse(File.ReadAllText(MyFilePath));

这段代码可以帮助你:

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


JObject data = JObject.Parse(_filePath );

.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的方法然后Json。网如果你使用的是。net core 3.0或更高版本,那么你可以使用System.Text.Json nuget包来序列化或反序列化。

您需要补充:

using System.Text.Json

然后你可以序列化为:

var jsonStr = JsonSerializer.Serialize(model);

反序列化为:

var model = JsonSerializer.Deserialize(jsonStr);
有一个更简单的方法从文件或从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项目 Nuget < / p >

使用开源库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. 少的方法:

定义匹配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

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

非常简单的方法,我发现在网上工作。json文件在c#(或任何其他编程语言)

先决条件: -

这里是URL ->https://app.quicktype.io/

步骤

1比;去这个URL - https://app.quicktype.io/

2比;复制并粘贴您的JSON文件结构到左侧侧边栏

app.quicktype.io

3比;从选项菜单中选择所需的语言(这里是c#)

4比;复制生成的代码并转到您的项目并创建一个具有相同名称的新.cs文件(这里" Welcome.cs")

Welcome.cs .cs

5比;将所有生成的代码粘贴到新创建的类中。

Welcome.cs pasted Code .cs

6比;就是这样。:)

获取价值的步骤

1比;转到主程序。cs文件或任何你需要访问它的地方。

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Access Json values using Keys.>");


String jsonString = new StreamReader("give <.json> file Path here").ReadToEnd();


// use below syntax to access JSON file
var jsonFile = Welcome.FromJson(jsonString);


string FileName = jsonFile.File;
long Lvl = jsonFile.Level;
bool isTrue = jsonFile.CSharp;


Console.WriteLine(FileName);//JSON
Console.WriteLine(Lvl);//1
Console.WriteLine(isTrue);//true
}
}