C#。如何将复杂的JSON反序列化到某个对象?

C#。如何将复杂的JSON反序列化到某个对象?,c#,json,C#,Json,例如,我使用pinterest API获取一些信息 正如您所看到的,这个链接以JSON格式返回文本,它非常复杂,非常简单 Dictionary<string,string> 字典 我想不合适 您可以推荐什么解决方案来解决此任务?我会使用一个外部API,比如,反序列化到您创建的POCO对象或JObject(Json.NET仍然是Nuget上下载量最多的包中的前三名,不用担心,它会一直存在) 第一种方法可以确保数据是开箱即用的,但会强制您事先声明数据类。来自Json.NET的官方

例如,我使用pinterest API获取一些信息

正如您所看到的,这个链接以JSON格式返回文本,它非常复杂,非常简单

Dictionary<string,string> 
字典
我想不合适


您可以推荐什么解决方案来解决此任务?

我会使用一个外部API,比如,反序列化到您创建的POCO对象或JObject(Json.NET仍然是Nuget上下载量最多的包中的前三名,不用担心,它会一直存在)

第一种方法可以确保数据是开箱即用的,但会强制您事先声明数据类。来自Json.NET的官方文档

string json = @"{
  'Name': 'Bad Boys',
  'ReleaseDate': '1995-4-7T00:00:00',
  'Genres': [
    'Action',
    'Comedy'
  ]
}";

Movie m = JsonConvert.DeserializeObject<Movie>(json);

string name = m.Name;
// Bad Boys

根据JSON响应创建类结构

比如说,

public class Pinner
{
    public string about { get; set; }
    public string location { get; set; }
    public string full_name { get; set; }
    public int follower_count { get; set; }
    public string image_small_url { get; set; }
    public int pin_count { get; set; }
    public string id { get; set; }
    public string profile_url { get; set; }
}


public class Pin
{
    public object attribution { get; set; }
    public string description { get; set; }
    public Pinner pinner { get; set; }
    public int repin_count { get; set; }
    public string dominant_color { get; set; }
    public int like_count { get; set; }
    public string link { get; set; }
    public Images images { get; set; }
    public Embed embed { get; set; }
    public bool is_video { get; set; }
    public string id { get; set; }
}

public class User
{
    public string about { get; set; }
    public string location { get; set; }
    public string full_name { get; set; }
    public int follower_count { get; set; }
    public string image_small_url { get; set; }
    public int pin_count { get; set; }
    public string id { get; set; }
    public string profile_url { get; set; }
}

public class Data
{
    public List<Pin> pins { get; set; }
    public User user { get; set; }
    public Board board { get; set; }
}

public class RootObject
{
    public string status { get; set; }
    public int code { get; set; }
    public string host { get; set; }
    public string generated_at { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}
公共类Pinner
{
关于{get;set;}的公共字符串
公共字符串位置{get;set;}
公共字符串全名{get;set;}
公共整数跟随者计数{get;set;}
公共字符串图像\u小\u url{get;set;}
公共int pin_计数{get;set;}
公共字符串id{get;set;}
公共字符串配置文件\u url{get;set;}
}
公共类Pin码
{
公共对象属性{get;set;}
公共字符串说明{get;set;}
公共Pinner Pinner{get;set;}
公共int repin_count{get;set;}
公共字符串主色{get;set;}
公共int-like_-count{get;set;}
公共字符串链接{get;set;}
公共图像图像{get;set;}
公共嵌入{get;set;}
公共bool是_video{get;set;}
公共字符串id{get;set;}
}
公共类用户
{
关于{get;set;}的公共字符串
公共字符串位置{get;set;}
公共字符串全名{get;set;}
公共整数跟随者计数{get;set;}
公共字符串图像\u小\u url{get;set;}
公共int pin_计数{get;set;}
公共字符串id{get;set;}
公共字符串配置文件\u url{get;set;}
}
公共类数据
{
公共列表管脚{get;set;}
公共用户{get;set;}
公共板{get;set;}
}
公共类根对象
{
公共字符串状态{get;set;}
公共整数代码{get;set;}
公共字符串主机{get;set;}
在{get;set;}处生成的公共字符串
公共字符串消息{get;set;}
公共数据数据{get;set;}
}
使用JavaScriptSerializer

using System.Web.Script.Serialization;

JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);
使用System.Web.Script.Serialization;
JavaScriptSerializer oJS=新的JavaScriptSerializer();
RootObject oRootObject=新的RootObject();
oRootObject=oJS.Deserialize(您的JSon字符串);
  • 根据JSON对象创建类。我建议您使用,它可以帮助您轻松生成类
  • 用于序列化和反序列化。在这里你可以找到更多关于它的信息

  • 谢谢大家,我用这个代码做了我想做的

     public Program()
            {
                using (var client = new WebClient())
                {
                    string str = client.DownloadString("https://api.pinterest.com/v3/pidgets/boards/Monokumagirl/anime-girls/pins/");
    
                    JObject jobject = JObject.Parse(str);
    
                    JToken pins = jobject["data"]["pins"];
    
                    int i = 0;
                    while(true)
                    {
                        try {
                            var pin = pins[i];
                            Console.WriteLine(pin["images"]["237x"]["url"]);
                            i++;
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine(e.Message);
                            break;
                        }
                    }
    
                    Console.WriteLine("count: " + i);
                }
    
                Console.ReadLine();
            }
    

    如何使用237x?我可以为“237x”对象创建一个名称以numberI get\uuuu invalid\u type\uuuuuu 237x开头的类,我想这不会起作用。这是可能的,请记住,它是一个通用工具,因此在某些情况下可能会有问题。尝试其他类似的方法,最后您可以尝试删除有问题的字段,然后手动将其添加到结果类中。
     public Program()
            {
                using (var client = new WebClient())
                {
                    string str = client.DownloadString("https://api.pinterest.com/v3/pidgets/boards/Monokumagirl/anime-girls/pins/");
    
                    JObject jobject = JObject.Parse(str);
    
                    JToken pins = jobject["data"]["pins"];
    
                    int i = 0;
                    while(true)
                    {
                        try {
                            var pin = pins[i];
                            Console.WriteLine(pin["images"]["237x"]["url"]);
                            i++;
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine(e.Message);
                            break;
                        }
                    }
    
                    Console.WriteLine("count: " + i);
                }
    
                Console.ReadLine();
            }