簡體   English   中英

JSON將自定義C#結構序列化為字符串,而不是對象

[英]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的情況,但是如果這是唯一的方法,那就去使用它:

JSON.Net結構序列化差異

C#自定義json序列化

帶有自定義序列化程序的JSON.NET到自定義對象

枚舉的JSON序列化為字符串

JavaScriptSerializer.Deserialize-如何更改字段名稱

我面臨着同樣的挑戰。 我通過編寫一個自定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM