C# 如何使用动态(数字)键名反序列化子对象?

C# 如何使用动态(数字)键名反序列化子对象?,c#,json,json.net,C#,Json,Json.net,如何反序列化此JSON数据?按键“100034”等本质上是动态的 { "users" : { "100034" : { "name" : "tom", "state" : "WA", "id" : "cedf-c56f-18a4-4b1" }, "10045" : { "name" : "steve", "sta

如何反序列化此JSON数据?按键“100034”等本质上是动态的

{
    "users" : {
        "100034" : {
            "name"  : "tom",
            "state" : "WA",
            "id"    : "cedf-c56f-18a4-4b1"
        },
        "10045" : {
            "name"  : "steve",
            "state" : "NY",
            "id"    : "ebb2-92bf-3062-7774"
        },
        "12345" : {
            "name"  : "mike",
            "state" : "MA",
            "id"    : "fb60-b34f-6dc8-aaf7"
        }
    }
}

是否有一种方法可以直接访问具有名称、状态和Id的每个对象?

对于具有不同属性名称的JSON对象,您可以使用
字典
代替常规类,其中
T
是表示项数据的类

像这样声明您的类:

class RootObject
{
    public Dictionary<string, User> users { get; set; }
}

class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);

对于属性名称可能不同的JSON对象,可以使用
字典
代替常规类,其中
T
是表示项数据的类

像这样声明您的类:

class RootObject
{
    public Dictionary<string, User> users { get; set; }
}

class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
  • 添加包System.Web.Script.Serialization

  • 假设您的JSON包含Internet用户列表,我将创建一个类似这样的类

    public class internet
    {
       public List<User> Users { get; set; }
    };
    public class User
    {
       public String Name { get; set; }
       public String Id { get; set; }
       public String State { get; set; }
    };
    
    公共类互联网
    {
    公共列表用户{get;set;}
    };
    公共类用户
    {
    公共字符串名称{get;set;}
    公共字符串Id{get;set;}
    公共字符串状态{get;set;}
    };
    
  • 假设JSON字符串位于变量“JSONDATA”中,请按照以下代码将JSON数据反序列化为类对象

         var JSONDATA = /* Your JSON String */;
         JavaScriptSerializer serializer = new JavaScriptSerializer();
         internet Intr = serializer.Deserialize<internet>(JSONDATA);
    
    var JSONDATA=/*您的JSON字符串*/;
    JavaScriptSerializer serializer=新的JavaScriptSerializer();
    internet Intr=序列化程序.反序列化(JSONDATA);
    
  • 添加包System.Web.Script.Serialization

  • 假设您的JSON包含Internet用户列表,我将创建一个类似这样的类

    public class internet
    {
       public List<User> Users { get; set; }
    };
    public class User
    {
       public String Name { get; set; }
       public String Id { get; set; }
       public String State { get; set; }
    };
    
    公共类互联网
    {
    公共列表用户{get;set;}
    };
    公共类用户
    {
    公共字符串名称{get;set;}
    公共字符串Id{get;set;}
    公共字符串状态{get;set;}
    };
    
  • 假设JSON字符串位于变量“JSONDATA”中,请按照以下代码将JSON数据反序列化为类对象

         var JSONDATA = /* Your JSON String */;
         JavaScriptSerializer serializer = new JavaScriptSerializer();
         internet Intr = serializer.Deserialize<internet>(JSONDATA);
    
    var JSONDATA=/*您的JSON字符串*/;
    JavaScriptSerializer serializer=新的JavaScriptSerializer();
    internet Intr=序列化程序.反序列化(JSONDATA);
    
    此处不重复原因的可能重复。。它的非法c#标识符和它的不重复原因的动态可能的重复。。它的非法c#标识符和动态alsoas(我前面提到的键是动态的)。。在这种情况下,您的解决方案将如何工作?我怎么知道要传递什么作为密钥?你试过了吗?字典在反序列化期间处理动态键。通过迭代字典中的
    keys
    集合来发现键是什么是很简单的。我在回答中添加了一个演示。@BrianRogers谢谢,Roger它帮了我很多忙。但是,你能告诉我,我们是否收到了一个没有任何键的回复,但在其内部细节中有键。我找不到办法。e、 g.在我的情况下,我接收到此类/相同类型的响应,但响应对象没有键。那么我将如何反序列化它,因为数据即将到来,但在反序列化之后,它将给出null。(我的响应对象的形状类似于{“10101”:{“名称”:“aaa”,“描述”:“aaa111”},{“20202”:{“名称”:“bbb”,“描述”:“bbb222”}}}}}}@MalikAsif将此作为一个新问题发布,以便您可以充分描述您所面临的问题。如果需要提供上下文,您可以链接回这个问题。我相信您救了很多生命。Brian。谢谢:)正如我前面提到的,键是动态的。。在这种情况下,您的解决方案将如何工作?我怎么知道要传递什么作为密钥?你试过了吗?字典在反序列化期间处理动态键。通过迭代字典中的
    keys
    集合来发现键是什么是很简单的。我在回答中添加了一个演示。@BrianRogers谢谢,Roger它帮了我很多忙。但是,你能告诉我,我们是否收到了一个没有任何键的回复,但在其内部细节中有键。我找不到办法。e、 g.在我的情况下,我接收到此类/相同类型的响应,但响应对象没有键。那么我将如何反序列化它,因为数据即将到来,但在反序列化之后,它将给出null。(我的响应对象的形状类似于{“10101”:{“名称”:“aaa”,“描述”:“aaa111”},{“20202”:{“名称”:“bbb”,“描述”:“bbb222”}}}}}}@MalikAsif将此作为一个新问题发布,以便您可以充分描述您所面临的问题。如果需要提供上下文,您可以链接回这个问题。我相信您救了很多生命。Brian。谢谢:)这将不起作用,因为JSON不包含列表(数组)。这将不起作用,因为JSON不包含列表(数组)。