Xamarin C#restsharp解析嵌套的json响应

时间:2019-06-20 09:37:29

标签: c# json restsharp

从API解析嵌套的JSON响应时遇到麻烦。

API返回带有对象数组的数组。我面临的问题是数组中的对象之前每个数组中包含的int值(请参阅附加的示例JSON代码片段)。

我目前已经设置了反序列化的类型和对象,这似乎还不错,但是,当restsharp无法将INT值反序列化为我的反序列化类型时,就会出现问题。

杰森

    [
         [
            1064,
            {
                "trx_id": "",
                "block": 0,
                "trx_in_block": 0,
                "op_in_trx": 0,
                "virtual_op": 0,
                "timestamp": "",
                "op": [
                    "vote",
                    {
                        "voter": "user1",
                        "author": "user2",
                        "permlink": "UUID",
                        "weight": 0
                    }
                ]
            }
        ]
    ]

请求

var response = await restClient.Execute<List<List<Models.Responses.AccountHistory.Transaction>>>(request);

Transaction.CS

    public class Transaction
        {
            public string trx_id { get; set; }
            public long block { get; set; }
            public long trx_in_block { get; set; }
            public long op_in_trx { get; set; }
            public long virtual_op { get; set; }
            //Etc..
    }

我正在尝试反序列化嵌套的事务数组,int值对我没有任何实际用途。 我正在寻找一种忽略整数而仅解析对象的方法。

错误

  

未处理的异常:Newtonsoft.Json.JsonSerializationException:将值0转换为类型“ Models.Responses.AccountHistory.Transaction”时出错。路径'[0] [0]',第1行,位置3。

2 个答案:

答案 0 :(得分:1)

您可以为RestSharp客户编写自己的custom deserializer

然后将其实例化时需要在客户端上进行设置。

答案 1 :(得分:0)

感谢您提供指向自定义反序列化器的指示,这很有帮助。下面的解决方案摘要:

[JsonConverter(typeof(HistoryDeserializer))]
    public class AccountHistory
    {
        public long Integer { get; set; }
        public Transaction transaction { get; set; }
    }

自定义JsonConverter

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            switch (reader.TokenType)
            {
                case JsonToken.StartObject:
                    var objectValue = serializer.Deserialize<Transaction>(reader);
                    return new AccountHistory { transaction = objectValue };
                case JsonToken.Integer:
                    var integerValue = serializer.Deserialize<long>(reader);
                    return new AccountHistory { Integer = integerValue };
            }
            return null;
        }