C#解码JSON - 所有对象都具有唯一名称

时间:2016-02-04 17:31:00

标签: c# json

有没有人对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;
}

2 个答案:

答案 0 :(得分:0)

将JsonMachine.timezone定义为字符串可能会有所不同,但在您的JSON中,它会以整数形式出现。

另外,请记住DataContractSerializer依赖于顺序。从我所看到的,它应该拿起" org"和"时区"。由于您没有使用[DataMember(Order = 1)] 它按字母顺序排列。

没有" guid"财产或" lost_contact" dc54806f4fe34cf5a83b0676555f8658对象上的属性,所以" org"是它寻找的第一件事。一旦找到它,它就不会在将来的查找中查看以前的属性。据说它可以提升性能。

您可以使用上述属性自行设置特定的订单预期。但是顺序必须保持一致,因为如果对象混乱,你会遇到DataContractSerializer的问题,可能需要转移到Newtonsoft.Json,这是一个不错的库。

答案 1 :(得分:0)