2015-12-27 100 views
1

我有一個包含參數/值對的JObject(例如「param1」:「aValue」)。我想從數據網格中捕獲的數據更新這些值。JToken類型轉換?

然後根據定義以下類型的JSON模式對參數值進行驗證:「string」,「integer」和「array」(類型爲「string」)。

只要參數值是字符串類型,我的代碼就可以正常工作。對於整數和數組我得到以下錯誤:

// parameter validation code 
.. 
IList<string> messages; 
bool result = Params.IsValid(paramSchema, out messages); 
.. 
// "Validation error: Invalid type. Expected Integer but got String" 
// I get a corresponding error for type "Array" 

很公平,我則增加了一個開關來獲得原始類型,所以我可以投相應的新值:

.. 
foreach (DataGridViewRow row in Param.Rows) 
{ 
    // get current value 
    JToken curToken = aJObject.GetValue(aDatagrid.row.Cells[0].Value.ToString()); 

    // get new value 
    JToken newToken = aDatagrid.row.Cells[1].Value.ToString(); 

    switch (currToken.Type) 
    { 
     case JTokenType.Integer: 
      newToken = convertTokenToInt(newToken); // ==> works but custom method 
      break; 
     case JTokenType.Array: 
      newToken = (JTokenType.Array)newToken; // ==> casting does not work! 
      break; 
    } 

    currToken.Replace(newToken); 
} 
.. 

有了這個代碼,我現在可以處理「字符串」和「整數」,但我需要另一種「數組」(類型爲「字符串」)或我將來可能使用的其他類型的自定義方法。對此不滿意...

我的自定義convertTokenToInt(newToken)例程只是將該值賦給一個int,然後將其重新分配回JToken。

.. 
int number; 

bool result = int.TryParse(aToken.ToString(), out number); 

if (result) 
{ 
    aToken = number; 
    return aToken; 
} 
.. 

這似乎表明隱式類型轉換是可能的JToken的,所以爲什麼我不能用澆鑄或的ConvertTo()或一些其他映射數據網格單元格的值到適當的JToken類型更傳統的方式是什麼?

感謝所有幫助解決這個簡單的問題:-)

回答

0

...這裏是這樣的作品,但也許還有一個更優雅的解決方案我的轉換方法...

private JToken convertTokenToArray(JToken aToken) 
{ 
    JArray arr = new JArray();    
    List<string> items = JsonConvert.DeserializeObject<List<string>>(aToken.ToString());   

    foreach (var item in items) 
    { 
     JToken i = item; 
     arr.Add(i); 
    } 

    return arr; 
}