JsonSerializer反序列化字节数组。

5

使用 Newtonsoft 反序列化字节数组时,我们可以通过编写以下代码来实现

 var stringValue = Encoding.UTF8.GetString(byteArray);
 T data = JsonConvert.DeserializeObject<T>(stringValue);

但是如何使用 System.Text.Json 来实现相同的功能?请注意,编码方式为UTF8。


3
你有阅读文档吗?你可以像这样使用 Utf8JsonReader 进行反序列化:var utf8Reader = new Utf8JsonReader(jsonUtf8Bytes); weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(ref utf8Reader);MSDN - HMZ
我做的第一件事就是看了那个例子,但它没有起作用 :( 我传递的是 byte[],不确定为什么它没有反序列化。 - hello world
你是否遇到了未与我们分享的异常情况?或者你是否得到了未与我们分享的意外结果? - JoelFan
1
@helloworld 这个例子是可行的。如果不可行,使用 ASP.NET Core 3.1 的所有人都会注意到。请发表你实际尝试过的内容、任何错误和样例数据。 - Panagiotis Kanavos
嗨,我没有收到任何错误信息。当我反序列化对象时,它返回默认值。我正在传递 Azure 服务总线消息体,它是一个字节数组。 - hello world
2个回答

4
这是一个使用字节数组反序列化UTF8字符串的工作示例(使用 System.Text.Json):
class Program
{
    static void Main(string[] args)
    {

        try
        {
            string str = "{ \"MyProperty1\":\"asd\",\"MyProperty2\":2 }";
            byte[] utfBytes = Encoding.UTF8.GetBytes(str);
            var jsonUtfReader = new Utf8JsonReader(utfBytes);
            ModelDTO modelDTO = JsonSerializer.Deserialize<ModelDTO>(ref jsonUtfReader);
            Console.WriteLine($"First:{modelDTO.MyProperty1}, Second:{modelDTO.MyProperty2}");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

模型DTO

public class ModelDTO
{
    public string MyProperty1 { get; set; }
    public int MyProperty2 { get; set; }      
}

输出:

第一项:asd,第二项:2


1
你为什么要构建 utfString - Joelius
@Joelius,除了清晰度之外没有其他原因,我们也可以这样做:byte[] utfBytes = Encoding.UTF8.GetBytes(str); - HMZ
我认为这并没有使它更清晰。在C#中,字符串是UTF-16编码的,无论你如何构造它们。因此,这只是一个不必要的操作,以一种复杂的方式克隆一个字符串,我个人认为这会带来困惑而不是帮助。 - Joelius

0
将字节数组序列化为JSON:
var bytes = MyByteArray;
var jsonString = JsonConvert.SerializeObject(bytes.Select(item => (int)item).ToArray());
// jsonString = [1, 0, 1, 0, 0, 0]

将JSON反序列化为字节数组:
// jsonString = [1, 0, 1, 0, 0, 0]
var bytesArray = JsonConvert.DeserializeObject<byte[]>(jsonString);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接