【发布时间】:2014-03-26 08:38:37
【问题描述】:
过去几个小时我一直在绞尽脑汁。
我发现您可以对数据进行序列化,这样就省去了为每个单独的 JSON 值创建无限长的.split 命令的麻烦。因此,我通过创建一个 JsonHelper 类来序列化和反序列化从 ASP.net 页面传递的 JSON 来跟踪 SO 和整个网络上的许多人所做的事情。
这是我的课:
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 行上放置一个断路器来检查,当我将鼠标悬停在它上面时,它说每个值都是当我在表单上提交值时为空(部门 = 0、类型 = 0 等)。
我尝试过使用DataContractJsonSerializer、JsonHelper 和JavaScriptSerializer。请注意,我不想导入另一个参考(即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
知道如何将这些提取到类变量中吗?
提前致谢。
【问题讨论】:
-
这似乎您的类定义不适合 JSON 字符串。您能否发布可以演示问题的示例 JSON 字符串(反序列化为
NewTaskOb时仍输出空属性) -
我目前要到明天才能上班,但是一旦我进入办公室,我将使用 JSON 字符串修改我的帖子。感谢您的回复。
-
好的,这里有两种不同的场景。如果我输入
Dim taskData As NewTaskOb = jss.Deserialize(Of NewTaskOb)(task),则会出现无法将字符串转换为 int 的错误 - 因为所有值都是空值。如果我输入Dim taskData = jss.Deserialize(Of Object)(task),我会得到屏幕截图上看到的内容,它会出现一个异常,上面写着Public member 'Department' on type 'Dictionary(Of String,Object)' not found. -
另外,在我的 JSON 中,我将 Budget 标记更改为 BudgetString,就像在 NewTaskOb 类对象中一样。
标签: json vb.net serialization