這是我定義的 dto 類:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace DeserializeDemo
{
public class SubTaskRuleDto
{
public Guid Id { get; set; }
[JsonConverter(typeof(ByteArrayConverter))]
public byte[] Content { get; set; }
public bool DisableImage { get; set; }
public bool UseMobileAgent { get; set; }
public bool SupplementEnable { get; set; }
}
public class ByteArrayConverter : JsonConverter<byte[]>
{
public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
short[] sByteArray = JsonSerializer.Deserialize<short[]>(ref reader);
byte[] value = new byte[sByteArray.Length];
for (int i = 0; i < sByteArray.Length; i )
{
value[i] = (byte)sByteArray[i];
}
return value;
}
public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options)
{
writer.WriteStartArray();
foreach (var val in value)
{
writer.WriteNumberValue(val);
}
writer.WriteEndArray();
}
}
}
然后我將展示asp.net核心控制器代碼:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
namespace DeserializeDemo.Controllers
{
[ApiController]
[Route("[controller]")]
public class Clouds : ControllerBase
{
private readonly ILogger<Clouds> _logger;
public Clouds(ILogger<Clouds> logger)
{
_logger = logger;
}
[HttpGet]
public SubTaskRuleDto Get()
{
return new SubTaskRuleDto()
{
Id = Guid.NewGuid(),
Content = new byte[] { 1, 7},
DisableImage = false,
UseMobileAgent = true,
SupplementEnable = false,
};
}
public enum ContentType
{
Xoml = 1,
Python = 7,
NodeJS = 8
}
}
}
api運行良好,在postman中測驗ok:
在此輸入圖片描述
當我在 python 客戶端呼叫 api 時,我的代碼是這樣的:
# -*- coding:utf-8 -*-
import json
import deserialize
import requests
class SubTaskRuleRes:
id: str
content: str
disableImage: bool
useMobileAgent: bool
supplementEnable: bool
def get_subtask_rule():
url = "http://localhost:5000/clouds"
res = requests.get(url)
# print(res.content)
# binary = res.content
# output = json.loads(binary)
my_instance = deserialize.deserialize(SubTaskRuleRes, res.json())
print(my_instance)
get_subtask_rule()
反序列化 - 1.8.3 - https://github.com/dalemyers/deserialize
問題是我無法將串列反序列化為 '<class 'str'>' 或 SubTaskRuleRes.content 的串列。
uj5u.com熱心網友回復:
deserialize不執行隱式型別轉換。這就是你得到錯誤的原因(注意,總是發布你得到的完整回溯)。
查看檔案,您可以使用裝飾器來傳遞決議器函式(查看Advanced Usage/Parsers,例如
import deserialize
@deserialize.parser("content", str)
class SubTaskRuleRes:
id: str
content: str
disableImage: bool
useMobileAgent: bool
supplementEnable: bool
def get_subtask_rule():
spam = {'id':'28631ee-abd', 'content':[1, 7],
'disableImage': False, 'useMobileAgent':True,
'supplementEnable': False}
return deserialize.deserialize(SubTaskRuleRes, spam)
rule = get_subtask_rule()
print(rule.content)
print(type(rule.content))
輸出
[1, 7]
<class 'str'>
請注意,我不確定您為什么要content成為串列文字、字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/386273.html
