2013-08-16 82 views
2

我已經查看了各種問題,但我不確定如何實現此操作。JSON將自定義C#結構序列化爲字符串,而不是對象

我有一個自定義結構,它目前沒有公共屬性。當它通過WebApi返回時(不做任何花哨的序列化,只是返回自定義結構本身),它將作爲對象{}返回。

public struct CustomStruct 
{ 
    private string myProperty; 

    ... 

    public override string ToString() 
    { 
     return this.myProperty; 
    } 

    ... 

} 

自定義結構本身是一個屬性的上的父類的類型,其序列化爲:

{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{} } 

當我上的自定義結構我想的輸出一個重寫的ToString()私人財產。將對象作爲JSON對象返回到JavaScript-land時,可以實現類似的行爲嗎?

E.g.我的私有屬性是一個名爲「myProperty」的字符串,設置爲「test」。 如果我增加了一個叫做「myProperty的」公共財產,我會得到下面的輸出:

{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":{ "MyProperty":"test" } } 

當我真正想要的是:

{ "MyProp1":"value1","MyProp2":"value2","MyCustomStruct":"test" } 

希望這是有道理的。

下面是相關的問題,並沒有真正幫助我很多。想盡可能避免使用JSON.NET但會去,如果它是唯一的出路:

JSON.Net Struct Serialization Discrepancy

C# custom json serialization

JSON.NET with Custom Serializer to a custom object

JSON serialization of enum as string

JavaScriptSerializer.Deserialize - how to change field names

+1

你目前使用什麼序列化?即什麼版本的WebAPI?如果這是最新版本的話,如果我沒有弄錯的話,你已經在使用JSON.Net。 –

+0

MVC 4,.NET 4.0 ...是的,有一個默認創建的JSON.NET的引用,我可以使用它,此刻我只是返回我的類的集合,而不是ActionResult/ContentResult或類似的東西。 –

回答

1

我現在所做的,是在父類CustomClass添加第二個屬性...

public string MyCustomStructValue { get { return MyCustomStruct.ToString(); } } 

那麼[IgnoreDataMember]屬性添加到原產權...

[IgnoreDataMember] 
public CustomStruct MyCustomStruct { get; set; } 

的正常工作與下列行動:

public IEnumerable<CustomClass> Get() 
{ 
    return GetResults(); 
} 
3

我面臨同樣的挑戰。

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方法自定義JsonConverter因爲反序列化需要將ToString結果轉換回一個對象,並且會因類型而異。

+0

太棒了,謝謝! –

相關問題