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;
}
我在解析来自 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;
}