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

时间:2014-07-16 03:39:05

标签: c# json json.net

如何反序列化此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的对象?

2 个答案:

答案 0 :(得分:6)

对于属性名称可能不同的JSON对象,您可以使用Dictionary<string, T>代替常规类,其中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);

演示:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""users"": {
                ""10045"": {
                    ""name"": ""steve"",
                    ""state"": ""NY"",
                    ""id"": ""ebb2-92bf-3062-7774""
                },
                ""12345"": {
                    ""name"": ""mike"",
                    ""state"": ""MA"",
                    ""id"": ""fb60-b34f-6dc8-aaf7""
                },
                ""100034"": {
                    ""name"": ""tom"",
                    ""state"": ""WA"",
                    ""id"": ""cedf-c56f-18a4-4b1""
                }
            }
        }";

        RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

        foreach (string key in root.users.Keys)
        {
            Console.WriteLine("key: " + key);
            User user = root.users[key];
            Console.WriteLine("name: " + user.name);
            Console.WriteLine("state: " + user.state);
            Console.WriteLine("id: " + user.id);
            Console.WriteLine();
        }
    }
}

输出:

key: 10045
name: steve
state: NY
id: ebb2-92bf-3062-7774

key: 12345
name: mike
state: MA
id: fb60-b34f-6dc8-aaf7

key: 100034
name: tom
state: WA
id: cedf-c56f-18a4-4b1

答案 1 :(得分:-1)

  1. 添加一个包System.Web.Script.Serialization;

  2. 假设您的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; }
    };
    
  3. 假设您的JSON字符串位于变量'JSONDATA'中,请按照以下代码将您的JSON数据序列化为Class对象。

         var JSONDATA = /* Your JSON String */;
         JavaScriptSerializer serializer = new JavaScriptSerializer();
         internet Intr = serializer.Deserialize<internet>(JSONDATA);