Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化正在更改的JSON_C#_Json - Fatal编程技术网

C# 反序列化正在更改的JSON

C# 反序列化正在更改的JSON,c#,json,C#,Json,编辑1:仍未解决 编辑2:最终解决!见下面的答案 我想反序列化C#中不断变化的JSON。这样,为它创建类是不可能的,因为我不能为每个变化的部分创建类。对象是正在更改的对象,如下所示: 未更改的JSON: { "Class 1": { "Blablabla": { "ExampleValue1": "Example Value", "ExampleValue2": 500 }, "Blablabla-Blablabla": { "E

编辑1:仍未解决

编辑2:最终解决!见下面的答案

我想反序列化C#中不断变化的JSON。这样,为它创建类是不可能的,因为我不能为每个变化的部分创建类。对象是正在更改的对象,如下所示:

未更改的JSON:

{
  "Class 1": {
    "Blablabla": {
       "ExampleValue1": "Example Value",
       "ExampleValue2": 500
  },
    "Blablabla-Blablabla": {
       "ExampleValue1": "Example Value",
       "ExampleValue2": 1000
}
为此:

{
  "Class 1": {
    "Blablabla-Changed-Blablabla": {
       "ExampleValue1": "Changed Example Value",
       "ExampleValue2": 750
  },
    "Blablabla-Blablabla-Changed-Blablabla": {
       "ExampleValue1": "Changed Example Value",
       "ExampleValue2": 1125
}
如何在C#中实现这一点?

您可以使用
Newtonsoft.Json.Linq
中的类

JToken token = JToken.Parse(json);
JToken class1 = token.SelectToken("Class1");
请注意,如果要在字段名中使用空格,则需要使用以下符号来使用
SelectToken
方法

JToken token = JToken.Parse(json);
JToken class1 = token.SelectToken("['Class 1']")

您还可以动态访问
JToken
的成员和子级。例如,如果要动态打印结构,可以执行以下操作

JToken token = JToken.Parse(json);
PrintChildren(token);

private void PrintChildren(JToken item)
{
    Console.WriteLine(item.Path);
    foreach(var child in item.Children())
    {
        PrintChildren(child);
    }
}

您还可以将json反序列化为
动态

dynamic obj = JObject.Parse(json);

您可以使用
Newtonsoft.Json.Linq
中的类

JToken token = JToken.Parse(json);
JToken class1 = token.SelectToken("Class1");
请注意,如果要在字段名中使用空格,则需要使用以下符号来使用
SelectToken
方法

JToken token = JToken.Parse(json);
JToken class1 = token.SelectToken("['Class 1']")

您还可以动态访问
JToken
的成员和子级。例如,如果要动态打印结构,可以执行以下操作

JToken token = JToken.Parse(json);
PrintChildren(token);

private void PrintChildren(JToken item)
{
    Console.WriteLine(item.Path);
    foreach(var child in item.Children())
    {
        PrintChildren(child);
    }
}

您还可以将json反序列化为
动态

dynamic obj = JObject.Parse(json);


我终于解决了。经过深思熟虑,我终于解决了这个问题。我在动态对象中循环,将JProperty对象转换为类并完成

我终于解决了。经过深思熟虑,我终于解决了这个问题。我在动态对象中循环,将JProperty对象转换为类并完成

传入格式集是已知的还是任意的?@mkArtak arbitral,因为文件名正在更改。我无法通过名称直接访问它们。传入的格式集是已知的,还是任意的?@mkArtak任意的,因为文件名正在更改。我不能通过名称直接访问它们。问题是,它应该在列表中枚举它们,并且可以直接访问,而不是通过名称(因为这些类名是文件名,也会更改)@danielk我添加了一个示例,说明如何在不知道其名称的情况下访问属性。是的,但这太复杂了,我必须循环到最后。有没有更简单的方法呢?@danielk这取决于你想做什么。我真的不知道目标是什么。下载JSON文件2。反序列化JSON文件3。对于每个对象,从它们那里获取内容,然后对其进行处理。问题是,它应该在列表中枚举它们,并且可以直接访问,而不是通过名称(因为这些类名是文件名,也会更改)@danielk我添加了一个示例,说明如何在不知道属性名称的情况下访问属性。是的,但这太复杂了,我必须循环到最后。有没有更简单的方法呢?@danielk这取决于你想做什么。我真的不知道目标是什么。下载JSON文件2。反序列化JSON文件3。对于每一个物体,从他们那里得到东西,然后用它做点什么