DESERIALIZE COM NEWTONSOFT.JSON VB.NET

WCOSTA 03/07/2016 14:05:41
#464440
Galera este código abaixo tenta deserializar um conteudo de uma WEBAPI (abaixo), mas dá erro uma vez que diz que a Sequência não tem elementos.
O endereço da WEBAPI http://api.crossref.org/works?filter=doi:10.12741/ebrasilis.v9i1.479
{[Ô]status[Ô]:[Ô]ok[Ô],[Ô]message-type[Ô]:[Ô]work-list[Ô],[Ô]message-version[Ô]:[Ô]1.0.0[Ô],[Ô]message[Ô]:{[Ô]query[Ô]:{[Ô]search-terms[Ô]:null,[Ô]start-index[Ô]:0},[Ô]items-per-page[Ô]:20,[Ô]items[Ô]:[{[Ô]indexed[Ô]:{[Ô]date-parts[Ô]:[[2016,5,2]],[Ô]date-time[Ô]:[Ô]2016-05-02T15:40:48Z[Ô],[Ô]timestamp[Ô]:1462203648277},[Ô]reference-count[Ô]:0,[Ô]publisher[Ô]:[Ô]Entomo Brasilis[Ô],[Ô]issue[Ô]:[Ô]1[Ô],[Ô]DOI[Ô]:[Ô]10.12741\/ebrasilis.v9i1.479[Ô],[Ô]type[Ô]:[Ô]journal-article[Ô],[Ô]created[Ô]:{[Ô]date-parts[Ô]:[[2016,5,2]],[Ô]date-time[Ô]:[Ô]2016-05-02T14:34:25Z[Ô],[Ô]timestamp[Ô]:1462199665000},[Ô]page[Ô]:[Ô]18-25[Ô],[Ô]source[Ô]:[Ô]CrossRef[Ô],[Ô]title[Ô]:[[Ô]Din\u00e2mica Populacional de Mosca-Branca, Incid\u00eancia do Mosaico Dourado do Feijoeiro e Alternativas de Controle da Praga no \[Ô]Cultivo das Secas\[Ô] no Cerrado[Ô]],[Ô]prefix[Ô]:[Ô]http:\/\/id.crossref.org\/prefix\/10.12741[Ô],[Ô]volume[Ô]:[Ô]9[Ô],[Ô]author[Ô]:[{[Ô]affiliation[Ô]:[],[Ô]family[Ô]:[Ô]Toscano[Ô],[Ô]given[Ô]:[Ô]Luciana Claudia[Ô]},{[Ô]affiliation[Ô]:[],[Ô]family[Ô]:[Ô]Aguirre[Ô],[Ô]given[Ô]:[Ô]Washington Marques[Ô]},{[Ô]affiliation[Ô]:[],[Ô]family[Ô]:[Ô]Tomquelski[Ô],[Ô]given[Ô]:[Ô]Germison Vital[Ô]},{[Ô]affiliation[Ô]:[],[Ô]family[Ô]:[Ô]Maruyama[Ô],[Ô]given[Ô]:[Ô]Wilson Itamar[Ô]},{[Ô]affiliation[Ô]:[],[Ô]family[Ô]:[Ô]Gouveia[Ô],[Ô]given[Ô]:[Ô]Geraldo Candido[Ô]},{[Ô]affiliation[Ô]:[],[Ô]family[Ô]:[Ô]Dias[Ô],[Ô]given[Ô]:[Ô]Pamella Mingotti[Ô]}],[Ô]member[Ô]:[Ô]http:\/\/id.crossref.org\/member\/5044[Ô],[Ô]published-online[Ô]:{[Ô]date-parts[Ô]:[[2016,4,29]]},[Ô]container-title[Ô]:[[Ô]EntomoBrasilis[Ô]],[Ô]deposited[Ô]:{[Ô]date-parts[Ô]:[[2016,5,2]],[Ô]date-time[Ô]:[Ô]2016-05-02T14:34:25Z[Ô],[Ô]timestamp[Ô]:1462199665000},[Ô]score[Ô]:1.0,[Ô]subtitle[Ô]:[],[Ô]issued[Ô]:{[Ô]date-parts[Ô]:[[2016,4,29]]},[Ô]alternative-id[Ô]:[[Ô]ebrasilis.v9i1.479[Ô]],[Ô]URL[Ô]:[Ô]http:\/\/dx.doi.org\/10.12741\/ebrasilis.v9i1.479[Ô],[Ô]ISSN[Ô]:[[Ô]1983-0572[Ô]]}],[Ô]total-results[Ô]:1,[Ô]facets[Ô]:{}}}
  
Imports System.IO
Imports System.Net
Imports System.Net.Http
Imports System.Web
Imports EBM.cJson
Imports System.Web.Script.Serialization
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.Text


Public Class frmDoiSearch
Dim sDOi As String = [Ô]http://api.crossref.org/works?filter=doi:[Ô]

Private Async Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
Try
Dim sStr As String = String.Empty
Cursor = Cursors.WaitCursor
txtResult.ResetText()

Using client As New HttpClient()
client.BaseAddress = New Uri(sDOi & txtTermo.Text)
Dim response = Await client.GetAsync([Ô][Ô])
Dim dados As String = Await response.Content.ReadAsStringAsync()
Dim jss As New JavaScriptSerializer()
Dim DadosRet As List(Of DadosDOI) = jss.Deserialize(Of List(Of DadosDOI))(dados)
If response.IsSuccessStatusCode Then
MessageBox.Show(DadosRet.First().title)
Else
MessageBox.Show([Ô]Erro - Status: [ô][Ô] & response.StatusCode.ToString & [Ô][ô] Erro: [ô][Ô] & response.ReasonPhrase.ToString & [Ô][ô]![Ô], sTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
End Using
Catch ex As Exception
ErrorView(ex)
Finally
Cursor = Cursors.Default
End Try
End Sub
End Class

Public Class Rootobject
Public Property message As Message
End Class

Public Class Message
Public Property items() As DadosDOI
End Class

Public Class DadosDOI
Public Property indexed As Indexed
Public Property referencecount As Integer
Public Property publisher As String
Public Property issue As String
Public Property DOI As String
Public Property type As String
Public Property created As Created
Public Property page As String
Public Property source As String
Public Property title() As String
Public Property prefix As String
Public Property volume As String
Public Property author() As Author
Public Property member As String
Public Property publishedonline As PublishedOnline
Public Property containertitle() As String
Public Property deposited As Deposited
Public Property score As Single
Public Property subtitle() As Object
Public Property issued As Issued
Public Property alternativeid() As String
Public Property URL As String
Public Property ISSN() As String
End Class

Public Class Indexed
Public Property dateparts() As Integer
Public Property datetime As Date
Public Property timestamp As Long
End Class

Public Class Created
Public Property dateparts() As Integer
Public Property datetime As Date
Public Property timestamp As Long
End Class

Public Class PublishedOnline
Public Property dateparts() As Integer
End Class

Public Class Deposited
Public Property dateparts() As Integer
Public Property datetime As Date
Public Property timestamp As Long
End Class

Public Class Issued
Public Property dateparts() As Integer
End Class

Public Class Author
Public Property affiliation() As Object
Public Property family As String
Public Property given As String
End Class
KERPLUNK 03/07/2016 17:41:53
#464441
Resposta escolhida
é incrível que esse NewtonSoft parece ser a única maneira que existe de serializar JSON, mas não é, na verdade é a pior possível. A biblioteca System.Web.Extensions, possui serializador JSON nativo. Então simplesmente inclua essa biblioteca no seu projeto(Framework 4.0 em diante) e simplesmente faça a desserialização:

HttpClient cliente = new HttpClient();
cliente.BaseAddress = new Uri([Ô]http://api.crossref.org/works?filter=doi:10.12741/ebrasilis.v9i1.479[Ô]);
string json = await cliente.GetStringAsync([Ô][Ô]);

DadosDOI dados = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<DadosDOI>(json);

MessageBox.Show(dados.message.items.First().author.First().given);


Por usar um método assíncrono com await, o escopo de método de onde isso é executado, também deve ser assíncrono. Por exemplo, em um botão:

private async void button1_Click(object sender, EventArgs e)
{
HttpClient cliente = new HttpClient();
cliente.BaseAddress = new Uri([Ô]http://api.crossref.org/works?filter=doi:10.12741/ebrasilis.v9i1.479[Ô]);
string json = await cliente.GetStringAsync([Ô][Ô]);

DadosDOI dados = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<DadosDOI>(json);

MessageBox.Show(dados.message.items.First().author.First().given);
}

Além disso, sua estrutura de classes não corresponde ao JSON fornecido.

Como são muitos os problemas, fiz um exemplo pra você e está em anexo.
WCOSTA 03/07/2016 18:05:38
#464442
Perfeito o uso da DLL NewtonSoft estava dando erro. tinha montado uma classe com a estrutura que você montou, mas como estava dando erro parti para algo mais simples, mas dando erro da mesma forma.
Abração KERPLUNK
Tópico encerrado , respostas não são mais permitidas