具有以下播放负载:
var playloads = new Dictionary<string, string>() {
{"FailMessage",
@"{
""success"": ""FALSE"",
""WsResult"": {
""result"": [],
""msg"": ""La r\u00e9f\u00e9rence ...""
}
}"},
{"SuccessMessage",
@"{
""success"": true,
""WsResult"": {
""result"": {
""FooNumber"": {
""Foo1"": {
""Bar1"":""... il y a un probl\u00c3\u00a8me ."",
""Bar2"":""bogus"",
""Bar3"":""bogus""
},
""Foo2"": {
""Bar1"":""bogus"",
""Bar2"":""bogus""
},
}
},
""mssg"": """"
}
}"}
};
在此示例中,当Api无法提供结果时,结果从Dictionary<string, Result>
切换为空数组。
我对成功请求的原始映射类是:
public class Foo1
{
public string Bar1 { get; set; }
public string Bar2 { get; set; }
public string Bar3 { get; set; }
}
public class Foo2
{
public string Bar1 { get; set; }
public string Bar2 { get; set; }
}
public class Result
{
public Foo1 Foo1 { get; set; }
public Foo2 Foo2 { get; set; }
}
public class WsResult {
public Dictionary<string, Result> result { get; set; }
public string msg { get; set; }
}
public class RootObject
{
public string success { get; set; }
public WsResult WsResult { get; set; }
}
反序列化的过程中,好的消息有效,而坏消息却给出了错误:
var resultA = JsonConvert.DeserializeObject<RootObject>(playloads["SuccessMessage"]);
var resultB = JsonConvert.DeserializeObject<RootObject>(playloads["FailMessage"]);
无法将当前的JSON数组(例如[1,2,3])反序列化为类型
Dictionary<string, Result>
因此,我尝试添加这种类型的属性,但无法使它使用相同的属性名称:
//[JsonProperty("result")]
public List<object> Failresult { get; set; }
我正在寻找一种处理这种情况的简单方法。更大的图景很简单: API的每个响应都具有相同的结构,并在中间具有棘手的属性,结果具有巨大的倾向,永远不会返回null或负值(例如false等),并且始终会返回空数组。
Methode getSomething:结果是“某物”或空数组。
Methode PostSomething:结果为1或为空数组。
Methode PostSomething2:结果为true或为空数组。
Methode GetID:结果是int ID或空数组。如果找不到。
等等。
在Json.net中,有没有一种方法可以使用属性的类型进行选择?
这与Json的C#表示无关。更多关于将相同属性映射到不同类型。但这不是重复的。空数组无内容不包含任何信息。因此,无需将其映射到任何东西。但是您可以JsonIgnore,因为它可能是空数组以外的其他东西,并包含所有信息。
答案 0 :(得分:0)
使用这个出色的网站JSON2CSHARP,我们可以看到失败json生成了这些类:
public class ObjetWSResult
{
public List<object> result { get; set; }
public string msg { get; set; }
}
public class RootObject
{
public string success { get; set; }
public ObjetWSResult objetWSResult { get; set; }
}
成功生成JSON时:
public class Foo1
{
public string Bar1 { get; set; }
public string Bar2 { get; set; }
public string Bar3 { get; set; }
}
public class Foo2
{
public string Bar1 { get; set; }
public string Bar2 { get; set; }
}
public class FooNumber
{
public Foo1 Foo1 { get; set; }
public Foo2 Foo2 { get; set; }
}
public class Result
{
public FooNumber FooNumber { get; set; }
}
public class ObjetWSResult
{
public Result result { get; set; }
public string mssg { get; set; }
}
public class RootObject
{
public bool success { get; set; }
public ObjetWSResult objetWSResult { get; set; }
}
虽然RootObject
是一致的,而ObjectWSResult
是不一致的,但是其中一个具有List
属性,而另一个则没有。因此,您不能使用一种机制来解析这些JSON。
您可以做的是假设JSON成功执行 try 解析,如果生成错误,您将捕获,然后以不同的方式解析(不同类)。