如果你不關心你的JSON中有一些額外的簿記信息,然後在JsonSerializerSettings
到All
(或Objects
)設置PreserveReferenceHandling
選項,@Athari建議。這是使其工作的最簡單方法。如果你這樣做,你的JSON應該是這樣的:
{
"$id": "1",
"Id": 123,
"OtherStuff": "other stuff A",
"MyChild": {
"$id": "2",
"Id": 456,
"OtherStuff": "other stuff B",
"MyParent": {
"$ref": "1"
}
}
}
這就是說,有一種方法做你原來想要的東西,使用自定義JsonConverter
。你可以做的是製作一個轉換器,它將接受任何具有Id屬性的對象。然後,對於那些您希望將其僅序列化爲ID的地方,可以使用[JsonConverter]
屬性修飾這些屬性。自定義轉換器將用於這些情況,但不會以其他方式使用。以下是轉換器的外觀:
class IdOnlyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsClass;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("Id");
writer.WriteValue(GetId(value));
writer.WriteEndObject();
}
private int GetId(object obj)
{
PropertyInfo prop = obj.GetType().GetProperty("Id", typeof(int));
if (prop != null && prop.CanRead)
{
return (int)prop.GetValue(obj, null);
}
return 0;
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要使用轉換器,您需要按照您的說明設置類。請注意0如何用屬性修飾來告訴Json.Net使用該屬性的自定義轉換器。
public class ObjA
{
public int Id { get; set; }
public string OtherStuff { get; set; }
public ObjB MyChild { get; set; }
}
public class ObjB
{
public int Id { get; set; }
public string OtherStuff { get; set; }
[JsonConverter(typeof(IdOnlyConverter))]
public ObjA MyParent { get; set; }
}
序列化時,您將需要的JsonSerializerSettings
的ReferenceLoopHandling
選項設置爲Serialize
告訴Json.Net如果檢測到參考迴路不是拋出一個錯誤,並繼續反正序列化(因爲我們的轉換器將處理它)。
全部放在一起,這裏是一些示例代碼演示了正在運行的轉換器:
class Program
{
static void Main(string[] args)
{
ObjA a = new ObjA();
a.Id = 123;
a.OtherStuff = "other stuff A";
ObjB b = new ObjB();
b.Id = 456;
b.OtherStuff = "other stuff B";
b.MyParent = a;
a.MyChild = b;
JsonSerializerSettings settings = new JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize,
Formatting = Newtonsoft.Json.Formatting.Indented
};
string json = JsonConvert.SerializeObject(a, settings);
Console.WriteLine(json);
}
}
這裏是上面的輸出:
{
"Id": 123,
"OtherStuff": "other stuff A",
"MyChild": {
"Id": 456,
"OtherStuff": "other stuff B",
"MyParent": {
"Id": 123
}
}
}
哦,好的,是的,我創建了一個轉換器,但不知道如何讓他進入屬性。這將工作正常。感謝你們兩位。 – Raif
嗨,所以一切都很好,除了我得到這個錯誤{「Message」:「發生錯誤」, 「ExceptionMessage」:「'ObjectContent'1'類型未能序列化內容類型的響應主體'application/json; charset = utf-8'。「, 」ExceptionType「:」System.InvalidOperationException「, 」StackTrace「:null, 」InnerException「:{ 」Message「:」發生錯誤。 , 「ExceptionMessage」:「錯誤創建GuidEntityToIdJsonConverter」, 「ExceptionType」:「Newtonsoft.Json.JsonException」, – Raif
哇抱歉缺乏在這個堆棧跟蹤結束格式化 – Raif