有没有人对System.Runtime.Serialization.Json和DataContracts有任何经验?我有一个Perl脚本,我正在转换为C#,我似乎无法弄清楚如何制作这个DataContract来解释网站的响应是一堆对象的事实。我试图假装对象不在那里,我试图定义一个合同,指定出来的第一个对象字符串,但我无法解析任何单个数据位。以下是作为请求响应返回的200个对象中的2个的示例。
当前数据合同尝试:
app.UseCookieAuthentication(options =>
{
options.AuthenticationScheme = "MyCookieMiddlewareInstance";
options.LoginPath = new PathString("/Account/Login/");
options.AccessDeniedPath = new PathString("/Account/Switch/");
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
});
来自服务器的JSON响应:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(JsonMachines));
JsonMachines machines = (JsonMachines)ser.ReadObject(resp.GetResponseStream());
[DataContract]
class JsonMachines
{
[DataMember]
public JsonMachine dc54806f4fe34cf5a83b0676555f8658;
}
[DataContract]
class JsonMachine
{
[DataMember]
public string guid;
[DataMember]
public int lost_contact;
[DataMember]
public string org;
[DataMember]
public string timezone;
}
答案 0 :(得分:0)
将JsonMachine.timezone定义为字符串可能会有所不同,但在您的JSON中,它会以整数形式出现。
另外,请记住DataContractSerializer依赖于顺序。从我所看到的,它应该拿起" org"和"时区"。由于您没有使用[DataMember(Order = 1)]
它按字母顺序排列。
没有" guid"财产或" lost_contact" dc54806f4fe34cf5a83b0676555f8658对象上的属性,所以" org"是它寻找的第一件事。一旦找到它,它就不会在将来的查找中查看以前的属性。据说它可以提升性能。
您可以使用上述属性自行设置特定的订单预期。但是顺序必须保持一致,因为如果对象混乱,你会遇到DataContractSerializer的问题,可能需要转移到Newtonsoft.Json,这是一个不错的库。
答案 1 :(得分:0)