我从 Java 服务返回以下 JSON
{"Test":{
"value": 1,
"message": "This is a test"
}}
我有以下 C# 类
class Test {
public int value { get; set; }
public String message { get; set; }
}
但是,因为返回了根标签“Test”,所以我无法直接反序列化它
Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString);
我发现我必须将 Test 类包装在另一个类中才能使其工作。除了
之外,还有什么简单的方法可以避免这种情况吗?JToken root = JObject.Parse(jsonString);
JToken testToken = root["Test"];
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString());
我调用的大多数服务也可以返回 Exception 对象。我想我应该读取 JSON 的“根”标签来确定如何反序列化对象。
如何获取第一个根标签和/或是否有更好、更优雅的方法来处理服务异常?
我也遇到了同样的问题,真的很想摆脱这个“容器”。我找到了这个解决方案,尽管您需要使用额外的字符串来查找根对象:
// Container I wanted to discard
public class TrackProfileResponse
{
[JsonProperty("response")]
public Response Response { get; set; }
}
// Code for discarding it
var jObject = JObject.Parse(s);
var jToken = jObject["response"];
var response = jToken.ToObject<Response>();
响应实际上是一个包含
Test
对象的对象。所以你的对象模型应该看起来是一样的。由于响应可能包含异常,因此您也应该反映这一点:
class Response
{
public Test Test { get; set; }
public JObject Exception { get; set; }
}
这假设您不知道
Exception
会是什么样子。如果这样做,请使用具体类型而不是 JObject
。然后,您可以根据 Response
是否为 Exception
来处理 null
对象。
如果您不想创建包装类型,您可以使用匿名类型:
var test =
JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test;
如果您有更多属性,例如异常,那么创建包装类型可能会更好。
简单地写一个包装器:
public class Wrapper
{
public Test Test { get; set; }
}
然后反序列化到这个包装器并通过
Test
属性获取 Test
实例:
Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test;