2014-03-18 270 views
6

我想弄清楚如何使用ASP.NET WebApi指定備用屬性名 - 並使其適用於反序列化+序列化和JSON + XML。到目前爲止,我只發現了部分解決方案。WebApi - 反序列化和序列化備用屬性名稱

我要揭露屬性名與下劃線較低的情況下,和(例如的緣故)有不同的內部名稱:

外部:

  • 現場一個
  • 現場兩個

內部:

  • ItemOne
  • ItemTwo

爲了進行測試,這裏只是中轉它所接收到一個POST控制器動作:

// POST api/values 
public TestSerialization Post([FromBody]TestSerialization value) 
{ 
    return value; 
} 

和測試實體:

public class TestSerialization 
{ 
    [DataMember(Name = "field_one")] // Doesn't appear to change anything 
    public string ItemOne { get; set; } 

    [JsonProperty(PropertyName = "field_two")] // Only works for serialization in JSON mode 
    public string ItemTwo { get; set; } 
} 

到目前爲止,我發現:

  • [數據成員(名稱= 「×」)]具有在任一方向上串行化沒有影響
  • 使用JSON時[JsonProperty(名稱= 「×」)]工作在序列化(返回值)。 (這是一個JSON.NET屬性,默認序列化程序)。

對於測試數據,我提交4個屬性,以查看哪個值被反序列化,和什麼屬性名稱是關於反序列化

  • ItemOne = 「值A」
  • ItemTwo =「B值「
  • 字段酮= 」正確1「
  • 字段二= 」更正2「

我怎樣才能做到這一點?

回答

11

你的一些研究結果/結論是不正確的......你可以嘗試,而不是執行以下操作:

這應該適用於網頁API的兩個默認XML & Json的格式化和兩個序列&反序列化。

[DataContract] 
public class TestSerialization 
{ 
    [DataMember(Name = "field_one")] 
    public string ItemOne { get; set; } 

    [DataMember(Name = "field_two")] 
    public string ItemTwo { get; set; } 
} 

下面應該只有Json的格式和兩個序列&反序列化工作。

public class TestSerialization 
{ 
    [JsonProperty(PropertyName = "field_one")] 
    public string ItemOne { get; set; } 

    [JsonProperty(PropertyName = "field_two")] 
    public string ItemTwo { get; set; } 
} 
+1

Ah - 由於類中遺漏了[DataContract]屬性,現在*服務器的序列化結果*在JSON和XML中都是正確的。來自UI的傳入請求仍然只是使用類的自然屬性名稱進行反序列化,而不是DataMember變體。 – Overflew

+0

不應該發生......你能分享你的原始請求看起來像嗎? –

+1

啊 - 我使用郵遞員來創建請求,並使用'x-www-form-encoded'選項卡。在'raw'標籤中使用手工輸入的JSON數據可以得到預期的結果。愚蠢的我,但我有點困惑,爲什麼一個'Rest API測試工具'具有花哨的鍵/值編輯工具作爲前2個選項卡(form-data&form-urlendcoded),在哪裏工具來生成一個JSON請求是手動的... – Overflew

4

你可以強制Asp。Net通過將JObject傳遞給你的動作來使用JSON解串器,儘管這樣做有點煩人。

然後,您可以使用它作爲JObject或調用.ToObject<T>();,然後它將兌現JsonProperty屬性。

// POST api/values 
public IHttpActionResult Post(JObject content) 
{ 
    var test = content.ToObject<TestSerialization>(); 
    // now you have your object with the properties filled correctly. 
    return Ok(); 
} 
+1

upvoted這一個,因爲當我使用這個,我立即想出了爲什麼我的POCO沒有被反序列化。抽象類失敗 –

+0

不適用於我。內容始終爲'null'。 它適用於([FromBody] TestSerialization值),但是JsonProperty被忽略。 –

相關問題