你可以寫一些規避的System.Uri
通常的處理和純粹把它當作一個字符串,使用Uri.OriginalString
屬性的輔助類。
下面是一個代碼示例,它與從Json.Net的JsonConverter
派生的轉換器類完全相同。
OriginalString Property (System.Uri) @ MSDN
有一點需要注意的是,你必須更新在您使用JsonConvert包括輔助類的額外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();
}
}
}
感謝您的回答。 Json.NET的作者解決了這個問題,不幸的是該修復只會在下一個版本中出現。直到那時,如果我可以堅持到4.0.2,如果不使用4.0.3與自定義轉換器 –