我正在使用Newtonsoft的JSON解析器来解析外部系统的结果(外部系统不是.net,所以他们使用不同的序列化库)。
JSON字符串对我来说很有趣。端点用于/ clients,但它不返回客户端资源数组,而是返回包含数组的命名对象。像这样:
{"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的属性?) 。
答案 0 :(得分:3)
你是对的。你拥有的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; }
}
放在JSON反序列化器中,如http://jsonutils.com
就像你最终通过使用你的Wrapper对象一样想出来。
var clientWrapper = serializer.Deserialize<RootObject>(json);
var clients = clientWrapper.Client;
这看起来与你的问题完全一样。如果这是外部系统提供数据的方式,那么除此之外别无他法。