Iul*_*scu 3 c# serialization json.net deserialization
我需要使用最新的(4.0.3)Json.NET库对包含System.Uri属性的对象进行序列化和反序列化。
以下代码演示了该问题:
string input = "http://test.com/%22foo+bar%22";
Uri uri = new Uri(input);
string json = JsonConvert.SerializeObject(uri);
Uri output = JsonConvert.DeserializeObject<Uri>(json);
Run Code Online (Sandbox Code Playgroud)
DeserializeObject方法抛出JsonReaderException。在4.0.2。下可以正常工作。
我已经通过测试和修补程序在Codeplex上提交了一个问题,以解决该问题,但是作者发布固定版本似乎需要一点时间。
同时,我能做些什么(使用JsonSettings或其他方法)来使最新版本按预期工作吗?
到目前为止,我有几个选择:
您可以System.Uri
使用该Uri.OriginalString
属性编写一个帮助程序类,该类避免常规的处理并将其纯粹视为字符串。
这是一个代码示例,该示例使用从Json.Net的派生的转换器类恰好做到了JsonConverter
。
OriginalString属性(System.Uri)@ MSDN
一个警告是,您必须更新使用JsonConvert的所有位置,以将helper类作为额外JsonConverter
参数之一包含在内。
我还添加了一个使用Uri作为类中的成员变量的示例,以说明不一定要重写类的属性,尽管它可能对您更方便。如果是这样,可以将其[JsonConverter(UriConverter)]
用作需要它的成员的属性。
using Newtonsoft.Json;
namespace JsonUriSerializeTest
{
class Program
{
public class UriConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.Equals(typeof(Uri));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
return new Uri((string)reader.Value);
}
if (reader.TokenType == JsonToken.Null)
{
return null;
}
throw new InvalidOperationException("Unhandled case for UriConverter. Check to see if this converter has been applied to the wrong serialization type.");
}
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("Unhandled case for UriConverter. Check to see if this converter has been applied to the wrong serialization type.");
}
}
public class UriPair
{
public string label { get; set; }
public Uri first { get; set; }
public Uri second { get; set; }
public void Display()
{
Console.WriteLine(string.Format("label: {0}", label));
Console.WriteLine(string.Format("first: {0}", first));
Console.WriteLine(string.Format("second: {0}", second));
}
}
static void Main(string[] args)
{
string input = "http://test.com/%22foo+bar%22";
Uri uri = new Uri(input);
string json = JsonConvert.SerializeObject(uri, new UriConverter());
Uri output = JsonConvert.DeserializeObject<Uri>(json, new UriConverter());
Console.WriteLine(input);
Console.WriteLine(output.ToString());
Console.WriteLine();
UriPair pair = new UriPair();
pair.label = input;
pair.first = null;
pair.second = new Uri(input);
string jsonPair = JsonConvert.SerializeObject(pair, new UriConverter());
UriPair outputPair = JsonConvert.DeserializeObject<UriPair>(jsonPair, new UriConverter());
outputPair.Display();
Console.WriteLine();
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)