2016-03-30 101 views
0

我正在使用JSON API。由於c#不接受像 - (減號)或。 (點),我不得不用_(下劃線)代替每個字符。當JSON響應作爲字符串接收時,會發生替換,以便每個包含 - 或a的屬性名稱。將它替換爲_,那麼每個屬性名稱將與它將被反序列化到的類中的屬性名稱相同。智能替換字符串

使其更清晰,下面是一些例子:

我收到以下JSON:{ "id": 1, "result": [ { "data": [ { "adm-pass": ""}]} 在我想反序列化類爲我有這樣的屬性:public String adm_pass {get; set;}

所以我更換了與減一個下劃線,以便NewtonSoft解析器可以相應地反序列化它。

我的問題是,我有時我在我的JSON中得到一些負整數。因此,如果我在{"beta" : -1}中執行字符串替換,我會得到解析異常,因爲-1(此處爲整數)變爲_1,無法正確反序列化並引發異常。

有沒有辦法巧妙地替換字符串,以便我可以避免此錯誤? 例如,如果 - 後跟int,則不會被替換。 如果這種方式不存在,是否有解決這類問題的方法?

回答

4

Newtonsoft一個正則表達式允許你指定的JSON屬性,它將使用的確切名稱序列化/反序列化。 所以,你應該能夠做到這一點

[JsonProperty("adm-pass")] 
public String adm_pass { get; set; } 

你是不是僅限於完全按照JSON屬性名命名的屬性這樣。在你的情況下,你不需要做一個字符串替換。

希望這會有所幫助。

+0

這很酷。我想知道微軟的DataContractJsonSerializer是否有類似的東西。我看了一下,它有一種方法可以用[DataMember(Name =「user_id」)]來更改名稱,但是我找不到它是否支持點(。)或破折號( - )。 – Rhyous

+0

非常感謝,這解決了整個問題。 –

+1

@Rhyous即使使用Microsoft的DataContractJsonSerializer,您也可以執行類似[DataMember(Name =「user-id」)]或[DataMember(Name =「user.id」)]的操作。這些支持 – Ferdin

2

你必須檢查要更換的關鍵,而不是價值,也許通過使用像http://regexr.com/3d471

+0

如果我理解正確,我必須把'content = content.Replace(「 - \ D」,「_」);'。但是這不適合'c#'。 –

+0

您需要使用Regex.Replace()。 https://msdn.microsoft.com/en-us/library/xwewhkd1%28v=vs.110%29.aspx – M22an

1

正則表達式可以按照wlalele的建議工作。

不過,我想創建一個新的對象是這樣的:這裏所描述

var sharpObj = {}; 
  • 遍歷對象作爲屬性:

    1. 創建一個新的對象 Iterate through object properties

      for (var property in object) { 
          if (object.hasOwnProperty(property)) { 
           // do stuff 
          } 
      } 
      
    2. 在// do stuff secti在sharpObj上用所需的字符串替換創建一個屬性,並將該屬性設置爲相同的值。

      var cleanProperty = cleanPropertyName(property); 
      sharpObj[cleanProperty] = orginalObject[property]; 
      

    注:我認爲你可以計算出cleanPropertyName()方法或相似。

    容易
  • 字符串化的對象

    var string = JSON.stringify(sharpObj); 
    
  • +0

    謝謝,但首先:這種方法將使服務器做更多的處理,其次:我已經有一個JSON字符串,我不想要創建另一個字符串,然後將其字符串化,第三:由於我的JSON具有更多屬性,因此需要更多編碼,而我不想那樣做。 –

    0

    您可以串檢查下一個字符是否是整數,這可以改裝成你的代碼,你已經找到一個字符,這樣你可以做

    int a; 
    
    if(int.TryParse(adm_pass.Substring(adm_pass.IndexOf("-") + 1,1),out a)) 
    { 
        //Code if next character is an int 
    } 
    else 
    { 
        adm_pass = adm_pass.Replace("-","_"); 
    } 
    

    這種代碼可以循環,直到沒有剩下的連字符/弊

    +0

    我想替換它們,而不是刪除它們。如果我正確理解你的話。 –

    +0

    是的,在捲髮裏面,你可以做你的替換,我會編輯清晰 –