我正在使用newtonsoft的JSON解析器来解析外部系统的结果(外部系统不是.NET,因此他们使用了不同的序列化库)。
JSON字符串对我来说很有趣。端点是为/客户端的,但是它没有返回客户资源数组,而是返回包含数组的命名对象。这样:
{"Client": [{"ClientId":"TheId"}]}
如果我试图将其验证到客户端数组中,则在例外情况下失败:
Client[] clients = serializer.Deserialize<Client[]>(aReaderWithTheJson)
例外:
无法对当前的JSON对象进行估算...修复此错误要么将JSON更改为JSON数组(例如[1,2,3])或更改 值得称赞的类型,因此它是一种普通的.NET类型
我已经通过为我的目标对象创建人造包装班来成功地进行了挑选:
class ClientArray
{
public Client[] Client {get;set;}
}
// then deserialize:
var clientWrapper = serializer.Deserialize<ClientArray>(theReader);
var client = clientWrapper.Client[0];
我的问题:虽然这起作用,但我不知道我应该研究的是JSON.NET的某些功能(某种序列化辅助助手还是我可以使用DTO装饰DTO的属性?)。
您是正确的。您拥有的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; }
}
将当放置在http://jsonutils.com之类的JSON避难所中时
就像您最终使用包装器对象发现的那样。
var clientWrapper = serializer.Deserialize<RootObject>(json);
var clients = clientWrapper.Client;
这看起来与您的问题完全一样。如果这是外部系统提供数据的方式,那么您实际上没有什么可做的。