JSON.NET根标记和反序列化

Sha*_*aun 9 c# serialization json.net

我从Java服务返回以下JSON

  {"Test":{
    "value": 1,
    "message": "This is a test"
  }}
Run Code Online (Sandbox Code Playgroud)

我有以下C#类

class Test {
    public int value { get; set; }
    public String message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,因为返回了根标签"Test",所以我无法直接反序列化

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString);
Run Code Online (Sandbox Code Playgroud)

我发现我必须将Test类包装在另一个类中才能使其工作.是否有一种简单的方法来避免这种情况

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

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

谢谢

Ayb*_*ybe 5

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

// 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>();
Run Code Online (Sandbox Code Playgroud)


Ale*_*Dev 1

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

var test = 
  JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test;
Run Code Online (Sandbox Code Playgroud)

如果您有更多属性(例如异常),那么创建包装类型可能会更好。