使用C#反序列化JSON

时间:2011-10-25 20:00:12

标签: c# json

我正在尝试将Facebook好友图形API调用反序列化为对象列表。 JSON对象如下所示:

{"data":[{"id":"518523721","name":"ftyft"},
         {"id":"527032438","name":"ftyftyf"},
         {"id":"527572047","name":"ftgft"},
         {"id":"531141884","name":"ftftft"},
         {"id":"532652067","name"... 

List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result);

它不起作用,因为原始对象无效 我怎样才能反序化呢?

10 个答案:

答案 0 :(得分:238)

您需要创建一个这样的结构:

public class Friends
{

    public List<FacebookFriend> data {get;set;}
}

public class FacebookFriend
{

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

然后你应该能够做到:

Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);

我的课程名称只是一个例子。你应该使用专有名称。

添加样本测试:

string json=
    @"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}";


Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json);

foreach(var item in facebookFriends.data)
{
   Console.WriteLine("id: {0}, name: {1}",item.id,item.name);
}

产地:

id: 518523721, name: ftyft
id: 527032438, name: ftyftyf
id: 527572047, name: ftgft
id: 531141884, name: ftftft

答案 1 :(得分:47)

有时我更喜欢动态对象:

public JsonResult GetJson()
{
  string res;
  WebClient client = new WebClient();

  // Download string
  string value = client.DownloadString("https://api.instagram.com/v1/users/000000000/media/recent/?client_id=clientId");

  // Write values
  res = value;
  dynamic dyn = JsonConvert.DeserializeObject(res);
  var lstInstagramObjects = new List<InstagramModel>();

  foreach(var obj in dyn.data)
  {
    lstInstagramObjects.Add(new InstagramModel()
    {
      Link = (obj.link != null) ? obj.link.ToString() : "",
      VideoUrl = (obj.videos != null) ? obj.videos.standard_resolution.url.ToString() : "",
      CommentsCount = int.Parse(obj.comments.count.ToString()),
      LikesCount = int.Parse(obj.likes.count.ToString()),
      CreatedTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((double.Parse(obj.created_time.ToString()))),
      ImageUrl = (obj.images != null) ? obj.images.standard_resolution.url.ToString() : "",
      User = new InstagramModel.UserAccount()
             {
               username = obj.user.username,
               website = obj.user.website,
               profile_picture = obj.user.profile_picture,
               full_name = obj.user.full_name,
               bio = obj.user.bio,
               id = obj.user.id
             }
    });
  }

  return Json(lstInstagramObjects, JsonRequestBehavior.AllowGet);
}

答案 2 :(得分:26)

为您自动生成这些类的一个好方法是复制JSON输出并将其放在此处:

http://json2csharp.com/

它将为您提供一个起点,用于修改您的类以进行反序列化。

答案 3 :(得分:25)

我们可以很容易地在字典和JavaScriptSerializer的帮助下解析json。这是我从ashx文件中解析json的示例代码。

var jss = new JavaScriptSerializer();
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json);
string _Name = sData["Name"].ToString();
string _Subject = sData["Subject"].ToString();
string _Email = sData["Email"].ToString();
string _Details = sData["Details"].ToString();

答案 4 :(得分:15)

对于这种情况,

Newtonsoft.JSON是一个很好的解决方案。同样Newtonsof.JSON比其他JavaScriptSerializerDataContractJsonSerializer更快。

在此示例中,您可以执行以下操作:

var jsonData = JObject.Parse("your json data here");

然后你可以将jsonData转换为JArray,你可以使用for循环来获取每次迭代的数据。 另外,我想添加一些东西。

for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
    var data = jsonData[i - 1];
}

使用动态对象并使用Newtonsoft序列化是一个不错的选择。

答案 5 :(得分:14)

我同意伊卡洛斯(如果可以,我会评论), 但不是使用 CustomObject 类, 我会使用字典(如果facebook添加了一些东西)。

private class MyFacebookClass
{
   public IList<IDictionary<string, string>> data { get; set; }
}

private class MyFacebookClass
{
   public IList<IDictionary<string, object>> data { get; set; }
}

答案 6 :(得分:1)

这是另一个网站,只要您拥有正确格式的JSON字符串,它就会为您提供所需的所有代码:

https://app.quicktype.io/

答案 7 :(得分:0)

序列化:

// Convert object to JOSN string format  
string jsonData = JsonConvert.SerializeObject(obj);  

Response.Write(jsonData);  

反序列化:

反序列化动态对象

  string json = @"{  
      'Name': 'name',  
      'Description': 'des'  
    }";  

var res = JsonConvert.DeserializeObject< dynamic>(json);  

Response.Write(res.Name);

答案 8 :(得分:0)

如果您使用的是.NET Core 3.0,则可以使用 System.Text.Json (现已内置)来反序列化JSON。

第一步是创建用于对JSON建模的类。有很多工具可以帮助解决这个问题,这里列出了一些答案。

有些选项是http://json2csharp.comhttp://app.quicktype.io,或使用Visual Studio(菜单 Edit Paste Special 将JSON粘贴为类) )。

public class Person
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class Response
{
    public List<Person> Data { get; set; }
}

然后您可以使用以下方法反序列化:

var people = JsonSerializer.Deserialize<Response>(json);

如果您需要添加诸如camelCase处理之类的设置,则可以像这样将串行器设置传递到解串器中:

var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
var person = JsonSerializer.Deserialize<Response>(json, options);

答案 9 :(得分:0)

您可以使用此扩展名

public static class JsonExtensions
{
   public static T ToObject<T>(this string jsonText)
   {
       return JsonConvert.DeserializeObject<T>(jsonText);
   }

   public static string ToJson<T>(this T obj)
   {
       return JsonConvert.SerializeObject(obj);
   }
}