2011-07-18 24 views
1

我傳遞一些JSON從客戶端傳回服務器端。確定JSON可以反序列化到什麼類型的對象?

if (historicalJSONAttributes != null) { 
    $find(ajaxManagerID).ajaxRequestWithTarget(radDock.get_uniqueID(), $.toJSON(historicalJSONAttributes)); 
} 

if (customJSONAttributes!= null) { 
    $find(ajaxManagerID).ajaxRequestWithTarget(radDock.get_uniqueID(), $.toJSON(customJSONAttributes)); 
} 

在這個時間點RadDock不規整使得存在派生類期望僅一個historicalJSONAttribute或customJSONAttribute。提供給RadDock的數據反映了它所持有的內容。我沒有看到一個理由(還沒有?)圍繞其可能的內容構建父控制。

這給我留下了以下問題,但是,我RadDock類的內部:

public void RaisePostBackEvent(string eventArgument) 
{ 
    HandleDialogClose(eventArgument); 
} 

private void HandleDialogClose(string json) 
{ 
    JsonConvert.DeserializeObject<HistoricalLocalSettingsJSON>(json); 
} 

我不能保證傳遞給HandleDialogClose JSON數據是HistoricalLocalSettingsJSON。我是否應該用一個標誌來預先推送我的eventArgument以指示它是哪種類型的數據?沒有完整的重組是否有更好的選擇?

感謝

我的課表:

[DataContract] 
public class HistoricalLocalSettingsJSON 
{ 
    private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    public HistoricalLocalSettingsJSON() { } 

    public HistoricalLocalSettingsJSON(string commandName, string dockID, string refreshEnabled, string refreshInterval, string chartType, string timeRestrictionEnabled, string timeStart, string timeEnd, string dataPointsEnabled) 
    { 
     Logger.InfoFormat("Command Name: {0}, DockID: {1}, RefreshEnabled: {2}, RefreshInterval: {3}, ChartType: {4}, TimeRestrictionEnabled: {5}, TimeStart: {6}, TimeEnd: {7}, DataPointsEnabled: {8}", 
      commandName, dockID, refreshEnabled, refreshInterval, chartType, timeRestrictionEnabled, timeStart, timeEnd, dataPointsEnabled); 

     CommandName = commandName; 
     DockID = dockID; 
     RefreshEnabled = bool.Parse(refreshEnabled); 
     RefreshInterval = int.Parse(refreshInterval); 
     ChartType = (Charts)Enum.Parse(typeof(Charts), chartType); 
     TimeRestrictionEnabled = bool.Parse(timeRestrictionEnabled); 
     TimeStart = timeStart; 
     TimeEnd = timeEnd; 
     DataPointsEnabled = !string.IsNullOrEmpty(dataPointsEnabled) ? bool.Parse(dataPointsEnabled) : false; 
    } 

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

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

    [DataMember(Name = "RefreshEnabled")] 
    public bool RefreshEnabled { get; set; } 

    [DataMember(Name = "RefreshInterval")] 
    public int RefreshInterval { get; set; } 

    [DataMember(Name = "ChartType")] 
    public Charts ChartType { get; set; } 

    [DataMember(Name = "TimeRestrictionEnabled")] 
    public bool TimeRestrictionEnabled { get; set; } 

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

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

    [DataMember(Name = "DataPointsEnabled")] 
    public bool DataPointsEnabled { get; set; } 
} 

[DataContract] 
public class CustomLocalSettingsJSON 
{ 
    private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    public CustomLocalSettingsJSON() { } 

    public CustomLocalSettingsJSON(string commandName, string dockID, string refreshEnabled, string refreshInterval, string chartType) 
    { 
     Logger.InfoFormat("Command Name: {0}, DockID: {1}, RefreshEnabled: {2}, RefreshInterval: {3}, ChartType: {4}", 
      commandName, dockID, refreshEnabled, refreshInterval, chartType); 

     CommandName = commandName; 
     DockID = dockID; 
     RefreshEnabled = bool.Parse(refreshEnabled); 
     RefreshInterval = int.Parse(refreshInterval); 
     ChartType = (Charts)Enum.Parse(typeof(Charts), chartType); 
    } 

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

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

    [DataMember(Name = "RefreshEnabled")] 
    public bool RefreshEnabled { get; set; } 

    [DataMember(Name = "RefreshInterval")] 
    public int RefreshInterval { get; set; } 

    [DataMember(Name = "ChartType")] 
    public Charts ChartType { get; set; } 
} 

因爲它的立場CustomLocalSettingsJSON是HistoricalLocalSettingsJSON的子部分。

回答

1

一種可能性是創建一個上層建築:

class ClientData { 
    HistoricalLocalSettingsJSON historicalJSONAttributes; 
    CustomLocalSettingsJSON customJSONAttributes; 
} 

然後,只需包裝在一個js對象,模仿這個,留下一個或其他屬性無效數據。

如果其中一個類是另一個類的子類,那麼也可以使用NewtonSoft JavaScript解串器的Populate方法來填充派生類的實例。如果您需要正確輸入對象,這可能沒有幫助,但您可以使用具有SubType屬性或類似屬性的單個類來重構對象模型。

但基本上你需要讓解串器知道如何處理數據。沒有提前寫出解析器來解決這個問題,沒有直接的方法可以做到這一點。

或者你可以只通過對象類型太的名字..

編輯

的一般方法,可以讓你添加一個信息參數,但仍保持它在一個屋檐下,會將其包含到具有兩個屬性的對象中,一個用於標識類型,另一個是JSON數據的字符串。 (沒錯 - 你會將它序列化兩次 - 首先是一個JSON字符串,然後是一個JSON字符串字符串,因此它可以作爲字符串而不是JSON對象傳遞。)

這可以讓您持續反序列化響應,然後決定如何繼續。

+0

現在閱讀有關Populate和SubType屬性。我不是100%確定我想創建CustomLocalSettingsJSON是HistoricalLocalSettingsJSON子節的依賴項。這個說法目前是真實的,但是沒有什麼能阻止老闆後來改變主意,我不願意通過做出這樣的假設而失去一大堆工作。 感謝您的指點。 :) –

+0

請參閱編輯..另一個想法爲通用的方式來處理它。您可以序列化數據兩次,並將其作爲字符串傳遞給一般對象。這可以讓服務器代碼一致地解密,然後使用正確的對象時間進行數據的最終反序列化。 –

+0

謝謝你。這看起來不錯,更直觀。我會用這個。 :) –

0

您可以將deserializeObject包裝在try/catch塊中,然後捕獲反序列化器在無法將json數據匹配到所需類型時拋出的特定異常。如果你只有兩種可能的類型,那麼你可以嘗試在第一個例外的情況下反序列化第二個類型。如果我的解釋不夠清楚,我可以稍後編寫代碼示例。

+1

:)當然,我寧願做預處理而不是使用異常作爲代碼導航的手段。 我目前的實現類似historicalJSONAttributes [「CommandName」] =「更新歷史本地設置」;然後,在服務器端,我調用string.Split(','),解析該標誌並作出相應的反應。只是似乎有點俗氣.. –

+0

問題是你已經有一個不太理想的情況。原諒我,如果我錯過了這一點,但有沒有一個特殊的原因,你不能有一個單獨的方法這兩種類型? – Garvin