JSON.NET根标签和反序列化

JSON.NET根标签和反序列化

问题描述:

我有以下JSON从Java服务JSON.NET根标签和反序列化

{"Test":{ 
    "value": 1, 
    "message": "This is a test" 
    }} 

我有以下的C#类

class Test { 
    public int value { get; set; } 
    public String message { get; set; } 
} 

然而,因为根标签“测试”是一个返回返回我不能直接反序列化这与

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString); 

我发现我必须包装在另一个测试类这个班的工作。有没有一种简单的方法可以避免这种情况?

JToken root = JObject.Parse(jsonString); 
JToken testToken = root["Test"]; 
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString()); 

最后我还有第二个问题。我调用的大多数服务也可以返回一个Exception对象。我想我会读取JSON的“根”标记以确定如何反序列化对象。我如何获得第一个根标签和/或是否有更好,更优雅的方法来处理服务中的异常?

由于

如果你不想创建你可以使用匿名类型的包装类型:

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; 

响应实际上是一个对象包含Test对象。所以你的对象模型看起来应该是一样的。而且,由于响应可以包含一个异常时,应当观照它:

class Response 
{ 
    public Test Test { get; set; } 
    public JObject Exception { get; set; } 
} 

这是假设你不知道会有怎样的Exception样子。如果是这样,请使用具体类型而不是JObject。然后,您可以根据Exception是否为null来处理对象Response

+0

我认为这可能实际上很好地工作,如果我使它的通用对象(测试对象)。这是解析一个或其他对象的非常简单的方法。谢谢 – Shaun

有同样的问题,真的想摆脱这个“容器”中,发现了这种解决方案虽然你需要使用一个额外的字符串来找到根对象:

// 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>();