C#在没有数据成员的情况下从Twitter序列化json
本文关键字:Twitter 序列化 json 情况下 数据成员 | 更新日期: 2023-09-27 18:26:52
我正在用C#开发自己的小型Twitter应用程序。我已经成功地从https://api.twitter.com/1/followers/ids.json?cursor=-1&屏幕名称=它返回如下内容:
{ "ids" : [ 401295021,
506271294,
14405250,
25873220
],
"next_cursor" : 0,
"next_cursor_str" : "0",
"previous_cursor" : 0,
"previous_cursor_str" : "0"
}
使用这个类,我可以序列化它:
[DataContract]
public class TwitterFollowers
{
[DataMember(Name = "ids")]
public IList<int> AccountIDs { get; set; }
}
现在我想得到追随者的屏幕名称,所以我使用这个网址:http://api.twitter.com/1/users/lookup.json?user_id=
这个json看起来像这样:
[ { "contributors_enabled" : false,
"created_at" : "Wed Apr 16 06:30:52 +0000 2008",
"default_profile" : false,
"default_profile_image" : false,
"description" : "",
"utc_offset" : -25200,
"verified" : false
},
{ "contributors_enabled" : false,
"created_at" : "Tue Mar 04 12:31:57 +0000 2008",
"default_profile" : true,
"default_profile_image" : false,
"description" : "",
"utc_offset" : 3600,
"verified" : false
}
]
正如您所看到的,数组立即启动,而不命名它。我的类应该如何序列化?
我试过这个,但不起作用:
[DataContract]
public class TwitterProfiles
{
[DataMember(Name = "")]
public IList<TwitterProfile> Profiles { get; set; }
}
[DataContract]
public class TwitterProfile
{
[DataMember(Name = "lang")]
public string Language { get; set; }
[DataMember(Name = "location")]
public string Location { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "screen_name")]
public string ScreenName { get; set; }
[DataMember(Name = "url")]
public string URL { get; set; }
}
您是否尝试一起删除DataMember属性的"Name"属性?含义:
[DataMember]
public IList<TwitterProfile> Profiles { get; set; }
如果这不起作用,您还可以选择从api调用中获取输出,并将其格式化为json字符串,您知道可以反序列化:
string.Format("{{'"profiles'":{0}}}", GetJsonResponse())
您提供的示例与类TwitterProfile
的成员不匹配。尽管如此,您不需要助手类来处理数组。您可以简单地将数组类型直接作为反序列化的目标。
这里有一个可以用来测试的代码示例。我已经删除了您的TwitterProfiles
类,并将TwitterProfile
精简为一个名为CreatedAt
的字段。
请注意以下来源中的以下行:
DataContractJsonSerializer js =
new DataContractJsonSerializer(typeof(TwitterProfile[]));
这是剩下的。
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
namespace TwProfileJson
{
class Program
{
[STAThread]
static void Main(string[] args)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() != DialogResult.OK) { return; }
string json = System.IO.File.ReadAllText(dlg.FileName);
using(MemoryStream stm = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(TwitterProfile[]));
TwitterProfile[] pps = (TwitterProfile[])js.ReadObject(stm);
foreach(TwitterProfile p in pps)
{
Console.WriteLine(p.CreatedAt);
}
}
Console.ReadKey();
}
[DataContract]
public class TwitterProfile
{
[DataMember(Name = "created_at")]
public string CreatedAt { get; set; }
}
}
}