2014-03-26 86 views
1

在過去的幾個小時裏,我一直在絞盡腦汁。VB.Net/JSON - 反序列化

我發現你可以序列化數據,並保存爲每個單獨的JSON值創建無限長的.split命令的麻煩。所以我通過創建一個JsonHelper類來序列化和反序列化從ASP.net頁面傳遞來的JSON,從而跟蹤了很多人在Web上做了什麼。

這是我的課:

Public Class NewTaskOb 
    Public Property Department As Integer 
    Public Property Type As Integer 
    Public Property AssignedTo As Integer 
    Public Property Priority As Integer 
    Public Property Title As String 
    Public Property JobCode As Integer 
    Public Property ParentTask As String 
    Public Property DueDate As Date 
    Public Property Scope As String 
    Public Property Comment As String 
    Public Property BudgetString As String 
End Class 

然後,我有這樣的:

<WebMethod()> Public Shared Function NewTaskRequest(task As String) As String 

    Dim newTask As NewTaskOb = DeserializeJSON.JsonDeserialize(Of NewTaskOb)(task) 

我的JSON根據jsonlint是有效的,但是當我通過值傳遞,我檢查通過在Dim newTask行上放置一個斷路器,當我將鼠標懸停在它上面時,它表示每個值都是空的(Department = 0,Type = 0等),在窗體上,I我正在提交價值。

我嘗試過使用DataContractJsonSerializer,JsonHelperJavaScriptSerializer。請注意,我不想輸入其他參考文獻(即Newtonsoft.Json或其他類似的文獻)。我想用前面提到的功能來完成這件事。

感謝您的幫助提前。

編輯(在JSON字符串本身添加):

{ 
"NewTask": { 
    "Department": "-1", 
    "Type": "0", 
    "AssignedTo": "0", 
    "Priority": "-1", 
    "Title": "", 
    "JobCode": "-", 
    "ParentTask": "-", 
    "DueDate": "", 
    "Scope": "", 
    "Comment": "", 
    "BudgetString": "" 
    } 
} 

編輯:

雖然與代碼瞎搞,我又回到了JavaScriptSerializer,發現如果我把Dim data = jss.Deserialize(Of Object)(task)代替Dim data = jss.Deserialize(Of NewTaskOb)(task),那麼它在顯示數據時會出現一個字典,其中包含數據的字段。

Dictionary showing JSON correctly http://imageshack.com/a/img401/1174/a9ju.png

任何想法,我怎麼能提取到這些類變量?

在此先感謝。

+1

這似乎是你的類定義不適合JSON字符串。你可以發佈可以演示問題的示例JSON字符串(當反序列化到'NewTaskOb'時仍然輸出空屬性) – har07

+0

我目前失業,直到明天,但一旦我進入辦公室,我將用JSON字符串修改我的文章。感謝您的回覆。 – DeeKayy90

+0

好的,這裏有兩種不同的場景。如果我把'Dim taskData As NewTaskOb = jss.Deserialize(Of NewTaskOb)(task)',它會出現一個不能將字符串轉換爲int的錯誤 - 因爲所有的值都是空值。如果我把'Dim taskData = jss.Deserialize(Of Object)(task)'我得到了屏幕截圖上看到的內容,並且在類型'Dictionary(Of String, Object)'not found.' – DeeKayy90

回答

1

所以我在我的系統上測試你的程序,並注意到它有字典「2。想象它可能意味着什麼,我的想法是2可能意味着有一本字典嵌套的字典 - 這可以解釋爲什麼你不能檢索這些值,所以我編輯了一下,最後以這一行 - Dim taskData = jss.Deserialize(Of Dictionary(Of Object, Object))(task)。現在,當我運行它時,我已經輸入了Dim taskValues = taskData.Values,我可以使用它們各自的索引位置來引用每個值。

即taskValues(0)=部,taskValues(1)=類型等

另外,我除去你在哪裏插入數據到一個數據傳輸對象的線,從而消除了JSON內"NewTask":築巢,造成這種JSON:

{ 
"Department": "-1", 
"Type": "0", 
"AssignedTo": "0", 
"Priority": "-1", 
"Title": "", 
"JobCode": "-", 
"ParentTask": "-", 
"DueDate": "", 
"Scope": "", 
"Comment": "", 
"BudgetString": "" 
} 
+0

剛剛進行了測試,完美地滿足了我需要的功能。謝謝! – DeeKayy90