C# 当键值为未知对象时,使用反序列化嵌套json

C# 当键值为未知对象时,使用反序列化嵌套json,c#,json,.net,C#,Json,.net,我有一个5个对象嵌套的json文件。简而言之,json文件具有以下模式: { "Object1": { "Object2": { "Object3": { "Object4": [ "Object5", "Object5&quo

我有一个5个对象嵌套的json文件。简而言之,json文件具有以下模式:

 {
    "Object1": {
        "Object2": {
            "Object3": {
                "Object4": [
                    "Object5",
                    "Object5",
                    "Object5"
                ]
            }
        }
    }
}
编辑:以前我的命名不一致。我修改了名字,以反映给我的评论

我想将json反序列化为C#对象,如下所示

using System;
using Newtonsoft.Json;
namespace Example
{
    class Program
    {
        public class Object1
        {

            public string Name { get; set; }
            public Object2[] Object2s { get; set; }
        }
        public sealed class Object2
        {
            public string Name { get; set; }
            public Object3[] Object3s { get; set; }

        }
        public class Object3
        {
            public string Name { get; set; }
            public Object4 [] Object4s { get; set; }
        }
        public class Object4
        {
            public string Name { get; set; }
            public Object5 [] Object5s { get; set; }
        }
        public class Object5
        {
            public string Name { get; set; }
        }

        static void Main(string[] args)
        {
            string json = "{    \"Object1\": {    \"Object2\": {      \"Object3\": {        \"Object4\": [          \"Value1\",\"Value2\",\"Value3\"        ]    }  }}}";


            Object1[] object1s = JsonConvert.DeserializeObject<Object1[]>(json);

            Console.WriteLine(object1s[0].Name);
            

        }
    }
}
使用系统;
使用Newtonsoft.Json;
名称空间示例
{
班级计划
{
公共类对象1
{
公共字符串名称{get;set;}
public Object2[]Object2s{get;set;}
}
公共密封类对象2
{
公共字符串名称{get;set;}
public Object3[]Object3s{get;set;}
}
公共类对象3
{
公共字符串名称{get;set;}
public Object4[]Object4s{get;set;}
}
公共类对象4
{
公共字符串名称{get;set;}
公共对象5[]对象5s{get;set;}
}
公共类对象5
{
公共字符串名称{get;set;}
}
静态void Main(字符串[]参数)
{
字符串json=“{\'Object1\':{\'Object2\':{\'Object3\':{\'Object4\':[\'Value1\',\'Value2\',\'Value3\']}}”;
Object1[]object1s=JsonConvert.DeserializeObject(json);
Console.WriteLine(object1s[0].Name);
}
}
}
不幸的是,当我运行它时,它会导致以下异常:

 Newtonsoft.Json.JsonSerializationException
  HResult=0x80131500
  Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'Example.Program+Object1[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'Object1', line 1, position 15.
Newtonsoft.Json.JsonSerializationException
HResult=0x80131500
Message=无法将当前JSON对象(例如{“name”:“value”})反序列化为“Example.Program+Object1[]”类型,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。
若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的正常.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。
路径“Object1”,第1行,位置15。

有没有任何方法可以在不通过json树循环的情况下实现这一点?

会引发异常,因为您正试图将json对象反序列化到数组中。这行不通

Object1[] object1s = JsonConvert.DeserializeObject<Object1[]>(json);
JSON中还有一个问题,JSON对象中有两个同名属性:

    "Object4": [
      "Object5",
      "Object5",
      "Object5"
    ],
    "Object4": [
      "Object5",
      "Object5",
      "Object5"
    ]
如果要在Object3中包含多个Object4对象,可以使用数组:

{
    "Object1": {
        "Object2": {
            "Object3": {
                "Object4": [{
                        "Object5": [{}, {}, {}
                        ]
                    }, {
                        "Object5": [{}, {}, {}
                        ]
                    }
                ],
            }
        }
    }
}

Object4在json中重复两次。。。这是非法的。您在上一篇文章中删除了一些内容。@Jawad非常感谢!我只是修改了代码并删除了多个键的违规对象,这并不严格是非法的,但通常只使用最后一个键。请参阅以了解解决方法Show这是否适用于两个Object4属性?非常感谢!我会试试你的suggestions@Jawad我忽略了它,它需要解决。@Jawad谢谢你抓住了错误!建议的解决方案将导致空值而不是对象。
    "Object4": [
      "Object5",
      "Object5",
      "Object5"
    ],
    "Object4": [
      "Object5",
      "Object5",
      "Object5"
    ]
{
    "Object1": {
        "Object2": {
            "Object3": {
                "Object4": [{
                        "Object5": [{}, {}, {}
                        ]
                    }, {
                        "Object5": [{}, {}, {}
                        ]
                    }
                ],
            }
        }
    }
}