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

时间:2016-06-19 02:45:19

标签: c# json json.net

我正在使用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的属性?) 。

1 个答案:

答案 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;

这看起来与你的问题完全一样。如果这是外部系统提供数据的方式,那么除此之外别无他法。