我正在尝试将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);
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为原始对象无效.
我怎样才能反序化呢?
Ica*_*rus 257
你需要创建一个这样的结构:
public class Friends
{
public List<FacebookFriend> data {get; set;}
}
public class FacebookFriend
{
public string id {get; set;}
public string name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
然后你应该能够做到:
Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);
Run Code Online (Sandbox Code Playgroud)
我的班级名称只是一个例子.你应该使用专有名称.
添加样品测试:
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);
}
Run Code Online (Sandbox Code Playgroud)
生产:
id: 518523721, name: ftyft
id: 527032438, name: ftyftyf
id: 527572047, name: ftgft
id: 531141884, name: ftftft
Run Code Online (Sandbox Code Playgroud)
Bis*_*nna 49
有时我更喜欢动态对象
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);
}
Run Code Online (Sandbox Code Playgroud)
Jac*_*eld 36
为您自动生成这些类的一个好方法是复制JSON输出并将其放在此处:
它将为您提供一个起点来修改您的类以进行反序列化.
Tho*_*mas 27
我们可以很容易地在字典和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();
Run Code Online (Sandbox Code Playgroud)
小智 19
Newtonsoft.JSON对于这种情况来说是一个很好的解决方案.也Newtonsof.JSON就是比别人快等JavaScriptSerializer,DataContractJsonSerializer.
在此示例中,您可以执行以下操作:
var jsonData = JObject.Parse("your JSON data here");
Run Code Online (Sandbox Code Playgroud)
然后你可以将jsonData转换为JArray,你可以使用for循环来获取每次迭代的数据.另外,我想添加一些东西.
for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
var data = jsonData[i - 1];
}
Run Code Online (Sandbox Code Playgroud)
使用动态对象并使用Newtonsoft序列化是一个不错的选择.
Sti*_*len 15
我同意Icarus(如果可以,我会评论),但不使用CustomObject类,我会使用Dictionary(如果facebook添加了一些内容).
private class MyFacebookClass
{
public IList<IDictionary<string, string>> data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
要么
private class MyFacebookClass
{
public IList<IDictionary<string, object>> data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
hal*_*ldo 10
如果您使用的是.NET Core 3.0,则可以使用System.Text.Json(现已内置)来反序列化 JSON。
第一步是创建类来对 JSON 进行建模。有很多工具可以帮助解决这个问题,这里的一些答案列出了它们。
一些选项是http://json2csharp.com、http://app.quicktype.io,或使用 Visual Studio (菜单Edit → Paste Special → Paste JSON as classes)。
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
}
public class Response
{
public List<Person> Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下方法反序列化:
var people = JsonSerializer.Deserialize<Response>(json);
Run Code Online (Sandbox Code Playgroud)
如果您需要添加设置(例如camelCase处理),请将序列化器设置传递到反序列化器中,如下所示:
var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
var person = JsonSerializer.Deserialize<Response>(json, options);
Run Code Online (Sandbox Code Playgroud)
小智 5
序列化:
// Convert an object to JSON string format
string jsonData = JsonConvert.SerializeObject(obj);
Response.Write(jsonData);
Run Code Online (Sandbox Code Playgroud)
反序列化::
反序列化动态对象
string json = @"{
'Name': 'name',
'Description': 'des'
}";
var res = JsonConvert.DeserializeObject< dynamic>(json);
Response.Write(res.Name);
Run Code Online (Sandbox Code Playgroud)