[英]JSON serialize a custom C# struct to a string, not an Object
我看過各種問題,但不確定如何實現。
我有一個自定義結構,當前沒有任何公共屬性。 通過WebApi返回時(不進行任何復雜的序列化,僅返回自定義結構本身),它作為對象{}
返回。
public struct CustomStruct
{
private string myProperty;
...
public override string ToString()
{
return this.myProperty;
}
...
}
自定義結構本身是父類上屬性的類型,它會序列化為:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{} }
當我在自定義結構上覆蓋ToString()時,我要輸出私有屬性之一。 將對象作為JSON對象返回到JavaScript領域時,是否可以實現類似的行為?
例如,我的私有屬性是一個字符串,稱為“ myProperty”,設置為“ test”。 如果添加一個名為“ MyProperty”的公共屬性,則會得到以下輸出:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{ "MyProperty":"test" } }
當我真正想要的是:
{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":"test" }
希望這是有道理的。
以下是一些相關問題,對我沒有太大幫助。 想要避免使用JSON.NET的情況,但是如果這是唯一的方法,那就去使用它:
我面臨着同樣的挑戰。 我通過編寫一個自定義JsonConverter來解決它,該JsonConverter在轉換時使用對象ToString方法:
public class ToStringConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return true;
}
}
然后像這樣使用它作為JsonConverter屬性:
[JsonConverter(typeof(ToStringConverter))]
public AnotherObjectWithToString MyObject { get; set; }
我應該注意,這只能用於序列化,因為反序列化將需要將ToString結果轉換回一個對象,並且會因類型而異。
我現在要做的是在父CustomClass類上添加第二個屬性...
public string MyCustomStructValue { get { return MyCustomStruct.ToString(); } }
然后將[IgnoreDataMember]
屬性添加到原始屬性...
[IgnoreDataMember]
public CustomStruct MyCustomStruct { get; set; }
通過以下操作可以正常工作:
public IEnumerable<CustomClass> Get()
{
return GetResults();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.