正确的 Json.net 系统.对象往返
本文关键字:对象 系统 net Json | 更新日期: 2023-09-27 18:36:16
使用 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 而不是字符串读回?在这种特殊情况下,我只是尝试与 .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");
}
}
和 use 属性
[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
}
您还可以查看本文,了解有关 Uri (反)序列化错误 Json.NET 详细信息
JSON 只知道 JavaScript 数据类型:字符串、数字和布尔值。 URL 不在列表中。
事实上,JSON 的整个 POINT 就是允许松散类型的传输。 如果需要强类型传输,请查看更强的传输协议,如 WCF 二进制序列化。