为什么使用 JsonSerializer 序列化 Uri 时只能收到 Uri 字符串?

问题描述 投票:0回答:1

我确信这是一个“错误的问题”,但就是这样!

我想以 Json 格式序列化 Uri 属性。

但是,当我尝试做类似的事情时:

var jsonResults = System.Text.Json.JsonSerializer.Serialize(uri);

我得到的回报是实际的 Uri 字符串,而不是它的属性和值。

根据这样的文档: https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/how-to?pivots=dotnet-8-0

它应该将对象的属性及其名称和值序列化到字符串中,除非我完全误解了某些内容。

我使用字符串生成器创建了一种简单的方法来向您展示我正在谈论的值。他们将是这些:

[Uri 结果数据]

绝对 Uri:[https://westmd.craigslist.org/]

绝对路径:[/]

方案:[https]

主持人:[westmd.craigslist.org]

端口:[443]

路径和查询:[/]

DnsSafeHost:[westmd.craigslist.org]

权威:[westmd.craigslist.org]

片段:[]

方案和服务器:[https://westmd.craigslist.org]

IdnHost:[westmd.craigslist.org]

默认端口:[True]

主机名类型:[Dns]

用户信息:[]

[Uri 段]:

但是,当使用上面这行代码时,对于 JsonSerialization,它返回的只是..

[JSON]: "https://westmd.craigslist.org/"

根据我读过的文档和我读过的堆栈文章,JsonSerialization 应该具有这些属性及其值,即使默认情况下未缩进。

我只是使用了 MSDN 文档中列出的函数,预期结果与所示类似,

string jsonString = JsonSerializer.Serialize(weatherForecast);

结果...

{"日期":"2019-08-01T00:00:00-07:00","温度":25,"摘要":"热"}

根据 MSDN 文档

我不确定是否有特定的方法或不同的方式来处理 Uri 而不是其他对象,但任何帮助将不胜感激。

c# uri jsonserializer
1个回答
0
投票

c# 代码中的某处可能有一个隐藏的

Uri
转换器,它使用
ToString()
表示形式,如
System.UriTypeConverter
,解释输出格式。

你想要的这些属性实际上是无用的,因为大多数像

AbsoluteUri
这样的属性没有setter,这意味着你将无法反序列化它们;)

如果您绝对想要此框架对象的自定义序列化/反序列化,则必须编写自己的转换器,但我不确定这是一个好主意。

如果是这种情况,请查看您必须继承的

JsonConverter<T>
基类。

这是一个在您方便的时候进行序列化的初创公司

public class UriConverter : JsonConverter<Uri>
{
    public override Uri? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, Uri value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        writer.WriteString("absoluteUri", value.AbsoluteUri);
        writer.WriteNumber("port", value.Port);
        writer.WriteEndObject();
    }
}

然后这样使用

var options = new JsonSerializerOptions();
var converter = new UriConverter();

options.Converters.Add(converter);

var uri = new Uri("https://localhost:9044/admin");
var json = System.Text.Json.JsonSerializer.Serialize(uri, options);
© www.soinside.com 2019 - 2024. All rights reserved.