Json属性更改类型

时间:2019-01-11 08:22:46

标签: c# json

具有以下播放负载:

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,因为它可能是空数组以外的其他东西,并包含所有信息。

1 个答案:

答案 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 解析,如果生成错误,您将捕获,然后以不同的方式解析(不同类)。