我正在尝试捕获来自随机Json文件的所有节点的名称和值,我不知道它的结构(由用户上传)。
我可以遍历json字符串并获取我需要的信息但是如何从文件开始?如果我想反序列化它,我相信我需要一个类来保存该数据(我不知道文件结构)。
以下是我如何循环json字符串中的元素:
string json = @"{
'CPU': 'Intel',
'PSU': '500W',
'Drives': [
'DVD read/writer'
/*(broken)*/,
'500 gigabyte hard drive',
'200 gigabype hard drive'
]
}";
JsonTextReader reader = new JsonTextReader(new StringReader(json));
while (reader.Read())
{
if (reader.Value != null)
{
Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value);
}
else
{
Console.WriteLine("Token: {0}", reader.TokenType);
}
}
如何从文件中读取并将其设置为可由上述代码处理的字符串?这听起来像是一个基本问题,但几个小时后我仍然在努力解决这个问题。我所见过的所有人都希望你知道Json文件的结构,在这种情况下我不知道。
答案 0 :(得分:3)
这是dynamic
和ExpandoObject
的确切用例!在这里,您可以将json反序列化为对象,然后遍历对象的属性(查找如何使用ExpandoObjects)。
var expandoConverter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, expandoConverter);
或者,如果您只想将磁盘中的json作为字符串读取,请使用string json = File.ReadAllText(filePathAndName)
;
答案 1 :(得分:0)
Eriks的答案非常值得提及ExpandoObject
,dynamic
和File
来电。它得到了我的+1。
我向ErikEs添加了答案,要求包含该软件包并包含最小运行程序所需的详细信息。
此代码位于我的Program.cs
文件中,用于Visual Studio 2017中的控制台应用程序项目类型。您还应该在程序包管理器控制台中运行install-package newtonsoft.json
。此命令将加载newtonsoft.json.11.0.1
pakcage。 .Net Framework是4.6.1。
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Dynamic;
using System.IO;
namespace ReadJson
{
class Program
{
static void Main(string[] args)
{
string filePath = "<full path to json file>";
string json = File.ReadAllText(filePath);
var expandoConverter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, expandoConverter);
//do more with your dynamic object here...
}
}
}