2014-03-26 61 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