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