也許我看到的最接近的是使用JavaScriptSerializer
並將JavaScriptTypeResolver
傳遞給構造函數。它不會生成與您的問題完全相同的JSON格式,但它確實有一個_type
字段,它描述了要序列化的對象的類型。它可能會變得有點難看,但也許它會爲你製造詭計。
這裏是我的示例代碼:
public abstract class ProductBase
{
public String Name { get; set; }
public String Color { get; set; }
}
public class Drink : ProductBase
{
}
public class Product : ProductBase
{
}
class Program
{
static void Main(string[] args)
{
List<ProductBase> products = new List<ProductBase>()
{
new Product() { Name="blah", Color="Red"},
new Product(){ Name="hoo", Color="Blue"},
new Product(){Name="rah", Color="Green"},
new Drink() {Name="Pepsi", Color="Brown"}
};
JavaScriptSerializer ser = new JavaScriptSerializer(new SimpleTypeResolver());
Console.WriteLine(ser.Serialize(products));
}
}
而結果是這樣的:
[
{"__type":"TestJSON1.Product, TestJSON1, Version=1.0.0.0, Culture=neutral, Publ
icKeyToken=null","Name":"blah","Color":"Red"},
{"__type":"TestJSON1.Product, Test
JSON1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","Name":"hoo","Colo
r":"Blue"},
{"__type":"TestJSON1.Product, TestJSON1, Version=1.0.0.0, Culture=neu
tral, PublicKeyToken=null","Name":"rah","Color":"Green"},
{"__type":"TestJSON1.Dr
ink, TestJSON1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","Name":"P
epsi","Color":"Brown"}
]
我使用SimpleTypeConverter,默認情況下爲框架的一部分。您可以自行創建,以縮短__type
返回的內容。
編輯:如果我創造我自己的JavaScriptTypeResolver
縮短類型名稱回來後,我會產生這樣的:
[
{"__type":"TestJSON1.Product","Name":"blah","Color":"Red"},
{"__type":"TestJSON1.Product","Name":"hoo","Color":"Blue"},
{"__type":"TestJSON1.Product","Name":"rah","Color":"Green"},
{"__type":"TestJSON1.Drink","Name":"Pepsi","Color":"Brown"}
]
使用該轉換器類:
public class MyTypeResolver : JavaScriptTypeResolver
{
public override Type ResolveType(string id)
{
return Type.GetType(id);
}
public override string ResolveTypeId(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
return type.FullName;
}
}
而只是路過它進入我的JavaScriptSerializer
構造函數(而不是SimpleTypeConverter
)。
我希望這有助於!
嘿,你找到一個解決方案這我目前面臨着類似的問題?服務器(Java,帶有Jersey的Glassfish)將對象序列化爲JSON,客戶端(C#)需要反序列化這個對象。當使用XML一切工作正常... – hage 2012-03-09 13:24:04