2013-11-19 3 views
6

В принципе, я пытаюсь разобрать комментарии из потока 4chan, используя API 4chan JSON. https://github.com/4chan/4chan-APIDeserializing JSON в Visual Basic

В основном, есть одно богатое текстовое поле с именем input, а другое - post_text_box. То, что я пытаюсь сделать, это сделать так, чтобы JSON из потока 4chan, введенного во входное текстовое поле, и комментарии извлекались из этого 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 
+2

Если вы импортируете 'Newtonsoft.Json', то почему вы используете встроенный класс .NET System.Web.Script.Serialization.JavaScriptSerializer'? – valverij

ответ

16

Поскольку вы импортируете Newtonsoft.Json, вы можете просто использовать JsonConvert.DeserializeObject<T>(String) method:

Dim exampleJson As String = "{ 'no':'123', 'name':'Some Name', 'com':'This is a comment'}" 
Dim post As Post = JsonConvert.DeserializeObject(Of Post)(exampleJson) 
Dim com As String = post.com 
post_text_box.Text = com 

В качестве альтернативы, если вы не хотите, чтобы создать класс для Post, вы можете использовать JsonConvert.DeserializeAnonymousType<T>(String, T):

Dim exampleJson As String = "{ 'no':'123', 'name':'Some Name', 'com':'This is a comment'}" 
Dim tempPost = New With {Key .com = ""} 
Dim post = JsonConvert.DeserializeAnonymousType(exampleJson, tempPost) 
Dim com As String = post.com 
post_text_box.Text = com 

EDIT: Похоже, вы получаете массив из 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 
+0

При использовании вашей первой части кода она отлично работает. Теперь я перешел к следующему шагу и попробовал десериализацию JSON, введенного в текстовое поле с именем input_box и отображающее первый комментарий в окне вывода. Но при входе в следующий JSON (который только что созданный поток на 4chan) он ничего не отображает. pastebin.com/zNbdRSLW здесь также мой новый код pastebin.com/6Ebh3UTX – user3010090

+0

Каково значение 'input_box.Text'? Если вы добавите точку прерывания на свою строку, которая говорит 'Dim exampleJson As String = input_box.Text', вы можете навести указатель мыши на' input_box.Text', чтобы увидеть – valverij

+0

. Я наводил на него курсор, и он говорит, что свойство text is- "{" posts ": [{" no ": 38161812," now ":" 11 \/19 \/13 (Tue) 15:18 "," name ":" Anonymous "," com ":" testing нить для файлов JSON »,« filename »:« a4c »,« ext »:« .png »,« w »: 386,« h »: 378,« tn_w »: 250,« tn_h »: 244, tim, : 1384892303386, "время": 1384892303, "md5": "ВИГ \/aNmBqB + zOZY5upx1Fw ==", "FSIZE": 6234, "Ресто": 0, "bumplimit": 0, "imagelimit": 0, "ответы ": 0," images ": 0}]}" – user3010090

8

Вместо необходимости определить класс, вы можете десериализации JSON в Object, как это:

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) 

Теперь, в качестве примера, вы можете пройти через десериализованный JSON и построить таблицу HTML, например:

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() 

Отказ от ответственности: я ежедневно работаю с C#, и это пример C# с использованием dynamic, который был преобразован в VB.NET, пожалуйста, простите меня, если с этим возникли синтаксические ошибки.

+0

Этот подход заставил меня избавиться от моего веб-сервиса, который возвращал данные JSON обратно в jquery-элемент управления jsTree.com. Ничто не работало для меня, пока я не использовал 'Dim data = jss.Deserialize (Of Object) (json)' и возвратил Serialized форму 'data' назад. Другое дело, что OP, но вызывающий 'Deserialize()' then 'Serialize (data)' создал json-объект, который нужен jsTree. –

0

Кроме того, если у вас сложная строка json. Если в строке json есть подклассы, массивы и т. Д., Вы можете использовать этот способ ниже. Я попробовал, и это сработало для меня. Надеюсь, это будет полезно для вас.

Я использовал root-> simpleforecast-> forecastday [] -> date-> hight-> celsius, fahrenheit values ​​и т. Д. В строке json.

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 
0

Примечание:

Сначала вы должны установить Newtonsoft.Json на NuGet консоли. Затем добавьте следующий код поверх своего кода.

Imports Newtonsoft.Json 

Шаг: 1 Создать класс с & получить заданные свойства.

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 Просто перемещается по объекту. Имя существа следующим образом.

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