gpt4 book ai didi

c# - 正确的 Json.net System.Object 往返?

转载 作者:行者123 更新时间:2023-11-30 22:28:11 26 4
gpt4 key购买 nike

使用 Newtonsoft.Json 库,想象一下

public class Test
{
public Object Obj { get; set; }
}

现在,尝试像这样序列化它

var json = JsonConvert.SerializeObject(new Test(){ Obj = new Uri(@"http://www.google.com") });

...将给我以下 JSON

{
"Obj": "http://www.google.com"
}

显然没有足够的信息将它反序列化回 Uri 对象,事实上,尝试反序列化它会给我一个 String 对象。

是否有任何现有方法可以正确序列化和反序列化此处的类型信息,以便将对象作为 Uri 而不是 String 读回?在这种特殊情况下,我只是尝试与 .NET 应用程序进行互操作,反序列化的确切类型非常重要。

提前致谢。

最佳答案

如果要将字符串转换回Uri,可以使用自定义转换器属性

转换器

public class UriConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
//try to create uri out of the string
Uri uri;
if(Uri.TryCreate(reader.Value.ToString(), UriKind.Absolute, out uri))
{
return uri;
}
//just a string -> return string value
return reader.Value;
}

if (reader.TokenType == JsonToken.Null)
{
return null;
}

throw new InvalidOperationException("Unable to process JSON");
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (null == value)
{
writer.WriteNull();
return;
}

if (value is Uri)
{
writer.WriteValue(((Uri)value).OriginalString);
return;
}

throw new InvalidOperationException("Unable to process JSON");
}
}

和使用属性

 [JsonConverter(typeof(UriConverter))]
public object Obj {get;set;}

然后你应该能够确定底层对象是否是 Uri 之类的

  var data = JsonConvert.DeserializeObject<YourObject>(yourJSONString);
if (data.Obj is Uri)
{
... add logic here
}
else
{
... not Uri different logic
}

您还可以查看这篇文章以获取更多信息 Json.NET Uri (de)serialization errors

关于c# - 正确的 Json.net System.Object 往返?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com