在Visual basic中反序列化JSON

在Visual basic中反序列化JSON,json,vb.net,Json,Vb.net,基本上,我正在尝试使用4chan JSON API解析来自4chan线程的注释 基本上,有一个称为输入的富文本框和另一个称为后文本框。我想做的是,让输入文本框中输入来自4chan线程的JSON,并从该JSON中提取注释并显示在输出文本框中 但是,每当我尝试单击Go按钮时,什么都不会发生 这是到目前为止我的代码 Imports System.Web.Script.Serialization Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq

基本上,我正在尝试使用4chan JSON API解析来自4chan线程的注释

基本上,有一个称为输入的富文本框和另一个称为后文本框。我想做的是,让输入文本框中输入来自4chan线程的JSON,并从该JSON中提取注释并显示在输出文本框中

但是,每当我尝试单击Go按钮时,什么都不会发生

这是到目前为止我的代码

Imports System.Web.Script.Serialization
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Public Class Form1
    Private Sub start_button_Click(sender As Object, e As EventArgs) Handles start_button.Click
        Dim j As Object = New JavaScriptSerializer().Deserialize(Of Post)(input.Text)

        post_text_box.Text = j.com
    End Sub
End Class

Public Class Rootobject
    Public Property posts() As Post
End Class

Public Class Post
    Public Property no As Integer
    Public Property now As String
    Public Property name As String
    Public Property com As String
    Public Property filename As String
    Public Property ext As String
    Public Property w As Integer
    Public Property h As Integer
    Public Property tn_w As Integer
    Public Property tn_h As Integer
    Public Property tim As Long
    Public Property time As Integer
    Public Property md5 As String
    Public Property fsize As Integer
    Public Property resto As Integer
    Public Property bumplimit As Integer
    Public Property imagelimit As Integer
    Public Property replies As Integer
    Public Property images As Integer
End Class

无需定义类,您可以将JSON反序列化为
对象
,如下所示:

Dim json As String = "{""items"":[{""Name"":""John"",""Age"":""20"",""Gender"":""Male""},{""Name"":""Tom"",""Age"":""25"",""Gender"":""Male""},{""Name"":""Sally"",""Age"":""30"",""Gender"":""Female""}]}"

Dim jss = New JavaScriptSerializer()
Dim data = jss.Deserialize(Of Object)(json)
Dim sb As New StringBuilder()
sb.Append("<table>" & vbLf & "<thead>" & vbLf & "<tr>" & vbLf)

' Build the header based on the keys of the first data item.
For Each key As String In data("items")(0).Keys
    sb.AppendFormat("<th>{0}</th>" & vbLf, key)
Next

sb.Append("</tr>" & vbLf & "</thead>" & vbLf & "<tbody>" & vbLf)

For Each item As Dictionary(Of String, Object) In data("items")
    sb.Append("<tr>" & vbLf)

    For Each val As String In item.Values
        sb.AppendFormat("      <td>{0}</td>" & vbLf, val)
    Next
Next

sb.Append("</tr>" & vbLf & "</tbody>" & vbLf & "</table>")

Dim myTable As String = sb.ToString()
现在,作为一个示例,您可以循环使用反序列化的JSON并构建一个HTML表,如下所示:

Dim json As String = "{""items"":[{""Name"":""John"",""Age"":""20"",""Gender"":""Male""},{""Name"":""Tom"",""Age"":""25"",""Gender"":""Male""},{""Name"":""Sally"",""Age"":""30"",""Gender"":""Female""}]}"

Dim jss = New JavaScriptSerializer()
Dim data = jss.Deserialize(Of Object)(json)
Dim sb As New StringBuilder()
sb.Append("<table>" & vbLf & "<thead>" & vbLf & "<tr>" & vbLf)

' Build the header based on the keys of the first data item.
For Each key As String In data("items")(0).Keys
    sb.AppendFormat("<th>{0}</th>" & vbLf, key)
Next

sb.Append("</tr>" & vbLf & "</thead>" & vbLf & "<tbody>" & vbLf)

For Each item As Dictionary(Of String, Object) In data("items")
    sb.Append("<tr>" & vbLf)

    For Each val As String In item.Values
        sb.AppendFormat("      <td>{0}</td>" & vbLf, val)
    Next
Next

sb.Append("</tr>" & vbLf & "</tbody>" & vbLf & "</table>")

Dim myTable As String = sb.ToString()
Dim sb作为新的StringBuilder()
sb.追加(“&vbLf&&vbLf&&vbLf&&vbLf)
'基于第一个数据项的键生成标头。
对于每个键作为数据中的字符串(“项”)(0)。键
sb.AppendFormat(“{0}”和vbLf,键)
下一个
sb.追加(“&vbLf&&vbLf&&vbLf&&vbLf)
对于数据(“项”)中作为字典(字符串、对象)的每个项
sb.追加(““&vbLf”)
在item.Values中将每个val作为字符串
sb.AppendFormat(“{0}”&vbLf,val)
下一个
下一个
sb.追加(“&vbLf&&&vbLf&”)
将myTable设置为字符串=sb.ToString()

免责声明:我每天使用C#,这是一个使用转换为VB.NET的
dynamic
的C#示例,如果有任何语法错误,请原谅。

由于您正在导入
Newtonsoft.Json
,您可以使用

或者,如果不想为
Post
创建类,可以使用

编辑:看起来您正在从API获取一个数组:

{
    "posts" : [{
            "no" : 38161812,
            "now" : "11\/19\/13(Tue)15:18",
            "name" : "Anonymous",
            "com" : ‌​ "testing thread for JSON stuff",
            "filename" : "a4c",
            "ext" : ".png",
            "w" : 386,
            "h" : 378,
            "tn_w" : 250,
            "tn_h" : 244,
            "tim" ‌​ : 1384892303386,
            "time" : 1384892303,
            "md5" : "tig\/aNmBqB+zOZY5upx1Fw==",
            "fsize" : 6234,
            "‌​resto" : 0,
            "bumplimit" : 0,
            "imagelimit" : 0,
            "replies" : 0,
            "images" : 0
        }
    ]
}
在这种情况下,您需要将反序列化的类型更改为
Post()

首先,添加另一个小包装类:

Public Class PostWrapper
    Public posts() As Post
End Class
然后调整反序列化代码:

Dim json As String = input_box.Text
Dim postWrapper = JsonConvert.DeserializeObject(Of PostWrapper)(json) ' Deserialize array of Post objects
Dim posts = postWrapper.posts

If posts.Length = 1 Then ' or whatever condition you prefer
    post_text_box.Text = posts(0).com
End If

另外,如果您有复杂的json字符串。如果json字符串中有子类、数组等,您可以在下面使用这种方式。我试过了,它对我有效。我希望它对你有用

我访问了json字符串中的root->simpleforecast->forecastday[]->date->hight->Celsium,fahrenheit值等

Dim tempforecast = New With {Key .forecast = New Object}
Dim sFile As String = SimpleTools.RWFile.ReadFile("c:\\testjson\\test.json")
Dim root = JsonConvert.DeserializeAnonymousType(sFile, tempforecast)
Dim tempsimpleforecast = New With {Key .simpleforecast = New Object}
Dim forecast = jsonConvert.DeserializeAnonymousType(root.forecast.ToString(), tempsimpleforecast)
Dim templstforecastday = New With {Key .forecastday = New Object}
Dim simpleforecast = JsonConvert.DeserializeAnonymousType(forecast.simpleforecast.ToString(), templstforecastday)
Dim lstforecastday = simpleforecast.forecastday

For Each jforecastday In lstforecastday

    Dim tempDate = New With {Key .date = New Object, .high = New Object, .low = New Object}
    Dim forecastday = JsonConvert.DeserializeAnonymousType(jforecastday.ToString(), tempDate)

    Dim tempDateDetail = New With {Key .day = "", .month = "", .year = ""}
    Dim fcDateDetail = JsonConvert.DeserializeAnonymousType(forecastday.date.ToString(), tempDateDetail)


    Weather_Forcast.ForcastDate = fcDateDetail.day.ToString() + "/" + fcDateDetail.month.ToString() + "/" + fcDateDetail.year.ToString()


    Dim temphighDetail = New With {Key .celsius = "", .fahrenheit = ""}
    Dim highDetail = JsonConvert.DeserializeAnonymousType(forecastday.high.ToString(), temphighDetail)

    Dim templowDetail = New With {Key .celsius = "", .fahrenheit = ""}
    Dim lowDetail = JsonConvert.DeserializeAnonymousType(forecastday.low.ToString(), templowDetail)

    Weather_Forcast.highCelsius = Decimal.Parse(highDetail.celsius.ToString())
    Weather_Forcast.lowCelsius = Decimal.Parse(lowDetail.celsius.ToString())

    Weather_Forcast.highFahrenheit = Decimal.Parse(lowDetail.fahrenheit.ToString())
    Weather_Forcast.lowFahrenheit = Decimal.Parse(lowDetail.fahrenheit.ToString())


    Weather_Forcast09_Result.Add(Weather_Forcast)

Next
注:

首先,您必须在nuget控制台上安装Newtonsoft.Json。然后在代码的顶部包含以下代码

 Imports Newtonsoft.Json
步骤:1创建具有get&set属性的类

Public Class Student

Public Property rno() As String
    Get
        Return m_rno
    End Get
    Set(value As String)
        m_rno = value
    End Set
End Property
Private m_rno As String
Public Property name() As String
    Get
        Return m_name
    End Get
    Set(value As String)
        m_name = value
    End Set
End Property
Private m_name As String
Public Property stdsec() As String
    Get
        Return m_StdSec
    End Get
    Set(value As String)
        m_StdSec = value
    End Set
End Property
Private m_stdsec As String

End Class
步骤2:创建字符串作为json格式,转换为json对象模型

 Dim json As String = "{'rno':'09MCA08','name':'Kannadasan Karuppaiah','stdsec':'MCA'}"

 Dim stuObj As Student = JsonConvert.DeserializeObject(Of Student)(json)
步骤:3只需按object.entity名称遍历,如下所示

MsgBox(stuObj.rno)
MsgBox(stuObj.name)
MsgBox(stuObj.stdsec)

如果您正在导入
Newtonsoft.Json
,为什么要使用内置的.NET
System.Web.Script.Serialization.JavaScriptSerializer
类?使用第一段代码时,它可以完美地工作。现在我进入下一步,尝试反序列化输入到名为input_box的文本框中的JSON,并在输出框中显示第一条注释。但是,当输入以下JSON(它是4chan上新创建的线程的JSON)时,它不会显示任何内容。这里也是我的新代码pastebin.com/6ebh3utx输入框的值是多少?如果您在行中添加一个断点,表示
Dim exampleJson As String=input_box.Text
,您应该能够将鼠标悬停在
input_box.Text
上,然后将鼠标悬停在它上面,它表示Text属性为-“{”posts:[{”no:38161812,“now:“11\/19\/13(Tue)15:18”,“name:“Anonymous”,“com:”正在测试线程中的JSON内容“,”文件名“:”a4c“,”ext“:”png“,”w“:386,“h”:378,“tn_w”:250,“tn_h”:244,“tim”:138489203386,“time”:138489303,“md5”:“tig\/aNmBqB+zOZY5upx1Fw=”,“fsize”:6234,“resto”:0,“bumplimit”:0,“imagelimit”:0,“回复”:0,“images”:0}]“我明白了,它看起来像是一个阵列。我已经相应地更新了我的答案。我尝试了它,当尝试使用相同的JSON时,它抛出了错误。我尝试使用Rootobject类,但这似乎会产生更多的问题。这是我迄今为止的代码:再次感谢所有的帮助。这种方法使我摆脱了web服务的困境,web服务将JSON数据返回给jsTree.com上的jquery控件。在我使用
Dim data=jss.Deserialize(Of Object)(json)
并返回
data
的序列化形式之前,一切都不起作用。这是一个不同的问题,OP的but调用
反序列化()
然后
序列化(数据)
创建了jsTree需要的json对象。