Xamarin C# restsharp 解析嵌套 json 响应

Xamarin C# restsharp parsing nested json response

我在解析来自 API 的嵌套 JSON 响应时遇到了一些问题。

APIreturns一个数组,一个对象数组。我面临的问题是数组中对象之前的每个数组中包含的 int 值(参见附加示例 JSON 片段)。

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

Json

    [
         [
            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 值不是我有任何实际用途的东西。 我正在寻找一种忽略整数并仅解析对象的方法。

错误

Unhandled Exception: Newtonsoft.Json.JsonSerializationException: Error converting value 0 to type 'Models.Responses.AccountHistory.Transaction'. Path '[0][0]', line 1, position 3. occurred

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

这将需要在客户端实例化时进行设置。

感谢您对自定义反序列化器的指导,这很有帮助。以下解决方案片段:

[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;
        }