JSON.NET 根标签和反序列化

问题描述 投票:0回答:4

我从 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 的“根”标签来确定如何反序列化对象。

如何获取第一个根标签和/或是否有更好、更优雅的方法来处理服务异常?

c# json serialization json.net
4个回答
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>();
        

2
投票

响应实际上是一个包含

Test
对象的对象。所以你的对象模型应该看起来是一样的。由于响应可能包含异常,因此您也应该反映这一点:

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

这假设您不知道

Exception
会是什么样子。如果这样做,请使用具体类型而不是
JObject
。然后,您可以根据
Response
是否为
Exception
来处理
null
对象。


1
投票

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

var test = 
  JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test;

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


1
投票

简单地写一个包装器:

public class Wrapper
{
    public Test Test { get; set; }
}

然后反序列化到这个包装器并通过

Test
属性获取
Test
实例:

Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test;
© www.soinside.com 2019 - 2024. All rights reserved.