【问题标题】:Parsing Array of objects JSON in C#在 C# 中解析对象数组 JSON
【发布时间】:2017-09-19 10:17:22
【问题描述】:

我的 JSON 输入如下。对不起,太长了

{  
   "status":{  
      "success":[  
         {  
            "User":{  
               "id":"1377",
               "username":"Dr.Hema Sathish",
               "username_url":"dr-hema-sathish",
               "firstname":null,
               "lastname":null,
               "email":"madurai@sancheclinic.com",
               "password":"6c7ab07e828828206e3d7c56c3c35cfd383960cd",
               "user_level":"doctor"
            },
            "Speciality":{  
               "id":"2",
               "name":"Dermatology(Skin Specialist)",
               "slug":"dermatology-skin-specialist",
               "image":"1438693213.png",
               "status":"1",
               "created":"2015-07-08 03:35:57",
               "modified":"2016-09-13 13:58:36"
            }
         }
      ]
   }
}

我已成功从 URL 下载 JSON 字符串。

static void main
{
    using (var webClient = new System.Net.WebClient())
    {
        string json = webClient.DownloadString("http://myURL/");
        Console.WriteLine(json.ToString());
    }
}

现在我必须获取 User 和 Specialty 对象。解析对象数组 Json 令人困惑。怎么解析?

我尝试过反序列化。但它不起作用。

如何解析呢?

【问题讨论】:

  • 您检查过json c# 上的搜索引擎吗?你应该使用图书馆
  • 请提供您尝试过的代码示例
  • 我觉得今天将是 JSON 转换器的一天,我们每小时都会收到这样的问题。
  • 你的 json 无效

标签: c# json


【解决方案1】:

您的 json 无效...这是正确的 json

   {
    "status": {
        "success": [{
                "User": {
                    "id": "1377",
                    "username": "Dr.Hema Sathish"
                },
                "Speciality": {
                    "id": "2",
                    "name": "Dermatology(Skin Specialist)"
                }
            },
            {
                "User": {
                    "id": "1390",
                    "username": "Dr.Nichita Balaji"
                },
                "Speciality": {
                    "id": "2",
                    "name": "Dermatology(Skin Specialist)"
                }

            }
        ]
    }
   }

您可以创建以下类以使用 Newtonsoft 对其进行反序列化

public class User
{
    public string id { get; set; }
    public string username { get; set; }
}

public class Speciality
{
    public string id { get; set; }
    public string name { get; set; }
}

public class Success
{
    public User User { get; set; }
    public Speciality Speciality { get; set; }
}

public class Status
{
    public List<Success> success { get; set; }
}

public class RootObject
{
    public Status status { get; set; }
}

这是反序列化的代码

    string json =
        "   {\r\n   \t\"status\": {\r\n   \t\t\"success\": [{\r\n   \t\t\t\t\"User\": {\r\n   \t\t\t\t\t\"id\": \"1377\",\r\n   \t\t\t\t\t\"username\": \"Dr.Hema Sathish\"\r\n   \t\t\t\t},\r\n   \t\t\t\t\"Speciality\": {\r\n   \t\t\t\t\t\"id\": \"2\",\r\n   \t\t\t\t\t\"name\": \"Dermatology(Skin Specialist)\"\r\n   \t\t\t\t}\r\n   \t\t\t},\r\n   \t\t\t{\r\n   \t\t\t\t\"User\": {\r\n   \t\t\t\t\t\"id\": \"1390\",\r\n   \t\t\t\t\t\"username\": \"Dr.Nichita Balaji\"\r\n   \t\t\t\t},\r\n   \t\t\t\t\"Speciality\": {\r\n   \t\t\t\t\t\"id\": \"2\",\r\n   \t\t\t\t\t\"name\": \"Dermatology(Skin Specialist)\"\r\n   \t\t\t\t}\r\n\r\n   \t\t\t}\r\n   \t\t]\r\n   \t}\r\n   }";
    RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(json);
    var successes = rootObject.status.success;
    var specialityObjects = successes.Select(success => success.Speciality).ToList();
    var users = successes.Select(success => success.User).ToList();
    Console.WriteLine(users[0].id + " " + users[0].username);
    Console.WriteLine(users[1].id + " " + users[1].username);
    Console.WriteLine(specialityObjects[0].id + " " + specialityObjects[0].name);
    Console.WriteLine(specialityObjects[1].id + " " + specialityObjects[1].name);
    Console.ReadLine();

//输出

1377 Dr.Hema Sathish 第1390章 日多巴拉吉博士 2 皮肤科(皮肤专科) 2 皮肤科(皮肤专科)

【讨论】:

  • 如何显示用户和专业对象。正如你所展示的,我已经尝试过了。但 NullReferenceException 显示在这一行中。 Console.Writeln(User.id);
  • 如果我尝试使用 Console.WriteLine(tmp.status.success[0].User); 访问用户详细信息它只在输出中显示 filename.user。
  • @arthy...更新了我的答案...它的 LINQ 访问对象...如果对您有帮助,请不要忘记标记为答案
  • 非静态字段、方法或属性需要对象引用 "RootObject.status" 发生此错误。请帮帮我
  • 谢谢你。它有效..非常感谢你
【解决方案2】:

你必须根据 JSON 数据集创建类:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

public class Speciality
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后,您应该能够使用 JSON .NET 库进行反序列化

string json = webClient.DownloadString("http://myURL/");
User u = JsonConvert.DeserializeObject<User>(json);

可能还有其他可用的库,但 this one 工作正常(并且可以作为 NuGET 包使用)。

请注意,这只是一个示例,您的代码将丢失几个类以正确解析您的 JSON(Status 类等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多