C# 如何用奇怪的数组解析这个JSON

C# 如何用奇怪的数组解析这个JSON,c#,json,json.net,C#,Json,Json.net,我使用Newtonsoft的JSON解析器解析来自外部系统的结果(外部系统不是.net,因此它们使用不同的序列化库) JSON字符串在我看来有点滑稽。端点用于/clients,但它不返回客户端资源数组,而是返回包含数组的命名对象。像这样: {"Client": [{"ClientId":"TheId"}]} 如果我尝试将其反序列化到客户机阵列中,它将失败,并出现异常: Client[] clients = serializer.Deserialize<Client[]>(aRead

我使用Newtonsoft的JSON解析器解析来自外部系统的结果(外部系统不是.net,因此它们使用不同的序列化库)

JSON字符串在我看来有点滑稽。端点用于/clients,但它不返回客户端资源数组,而是返回包含数组的命名对象。像这样:

{"Client": [{"ClientId":"TheId"}]}
如果我尝试将其反序列化到客户机阵列中,它将失败,并出现异常:

Client[] clients = serializer.Deserialize<Client[]>(aReaderWithTheJson)
Client[]clients=序列化程序。反序列化(AreaderWithJSON)
例外情况:

无法反序列化当前JSON对象。。。要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或者更改 反序列化类型,使其成为正常的.NET类型

通过为目标对象创建一个人工包装器类,我成功地实现了反序列化,如下所示:

类客户端阵列
{
公共客户端[]客户端{get;set;}
}
//然后反序列化:
var clientWrapper=serializer.Deserialize(theReader);
var client=clientWrapper.client[0];

但我的问题是:虽然这是可行的,但JSON.net是否有一些我不知道的特性(某种序列化帮助程序,或者可以用来装饰DTO的属性?)

你说得对。您拥有的JSON是格式良好的JSON。没什么好笑的

它返回一个打包/包装在根对象中的客户机资源数组

{"Client": [{"ClientId":"TheId"}]}
对此有何决心

public class Client
{
    public string ClientId { get; set; }
}

public class RootObject // Same as you wrapper
{
    public IList<Client> Client { get; set; }
}
公共类客户端
{
公共字符串ClientId{get;set;}
}
公共类RootObject//与包装器相同
{
公共IList客户端{get;set;}
}
当放置在JSON反序列化程序中时,如

就像您最终通过使用包装器对象发现的那样

var clientWrapper = serializer.Deserialize<RootObject>(json);
var clients = clientWrapper.Client;
var-clientWrapper=serializer.Deserialize(json);
var clients=clientWrapper.Client;
这看起来和你的问题一模一样。如果外部系统就是这样提供数据的,那么就没有其他真正需要您做的事情了

var clientWrapper = serializer.Deserialize<RootObject>(json);
var clients = clientWrapper.Client;