JSon Serialize complex object with datatable inside - json

I have this kind of object:
Public Class ClasseProva
Inherits RM_Base
Public Sub New()
Me.NomeTabella = "ClasseProva"
End Sub
Private m_AZI_ID As Integer
Public Property AZI_ID() As Integer
Get
Return m_AZI_ID
End Get
Set(ByVal value As Integer)
m_AZI_ID = value
End Set
End Property
Private m_dtPROGETTI As DataTable
Public Function ProgettiRO() As DataTable
Return m_dtPROGETTI
End Function
Public Sub ProgettiWO(value As DataTable)
m_dtPROGETTI = value
End Sub
End Class
So if in my object there is no datatable, I know how to serialize using Json and use serialized object as cookie. So in this way I have
public ClasseProva CookieClasseProva
{
get
{
try
{
string myObjectJson = Request.Cookies["CookieClasseProva"].Value;
return JsonConvert.DeserializeObject<ClasseProva>(myObjectJson);
}
catch { return null; }
}
set
{
string myObjectJson = JsonConvert.SerializeObject(value);
var cookie = new HttpCookie("CookieClasseProva", myObjectJson)
{
Expires = DateTime.Now.AddYears(1)
};
Response.Cookies.Add(cookie);
}
}
But after I added datatable, serialization function doesn't serialize datatable.
EDIT:
I don't know how attach a project. But now I'm copying Class of my BL project
Public Class Class1
Private m_intValue As Integer
Public Property MyIntValue() As Integer
Get
Return m_intValue
End Get
Set(ByVal value As Integer)
m_intValue = value
End Set
End Property
Private m_dtValue As DataTable
Public Property MyDatatable() As DataTable
Get
Return m_dtValue
End Get
Set(value As DataTable)
m_dtValue = value
End Set
End Property
End Class
and code section of a simple page
Imports Newtonsoft.Json
Imports DatatableSerializationBL
Public Class _Default
Inherits Page
Public Property CookieUtente() As Class1
Get
Try
Dim myObjectJson As String = Request.Cookies("CookieUtente").Value
Return JsonConvert.DeserializeObject(Of Class1)(myObjectJson)
Catch
Return Nothing
End Try
End Get
Set(value As Class1)
Dim myObjectJson As String = JsonConvert.SerializeObject(value)
Dim cookie = New HttpCookie("CookieUtente", myObjectJson)
Response.Cookies.Add(cookie)
End Set
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim c As New Class1
c.MyIntValue = 1
c.MyDatatable = New DataTable
c.MyDatatable.NewRow()
CookieUtente = c
Console.WriteLine(CookieUtente.MyDatatable.Rows.Count)
End Sub
End Class
So in the design page , I print rows.count value and it prints 0
ROWS : <%= CookieUtente.MyDatatable.Rows.Count%>

Related

'The node must be of type 'JsonObject'.'

I'm trying to parse this Json
With the code:
Dim streamData As Stream = Nothing
Using http As New HttpClient
Dim url As String = "https://api.hotbit.io/api/v1/market.deals?market=KIBA/USDT&limit=150&last_id=1521100930&api_key=44812d8f-66d3-01c0-94c3b29305040b03&sign=98EEC3D69D3F70F9BDFED901984B2AA4"
Dim t As Task(Of Stream) = http.GetStreamAsync(url)
streamData = t.Result
End Using
Dim jsonResponse As JsonNode = JsonNode.Parse(streamData)
Dim result As JsonObject = jsonResponse("result").AsObject
Dim c As String = String.Empty
For Each kvp In result.AsEnumerable
c &= kvp.Value("price").ToString & vbCr
Next
RichTextBox1.Text = c
End Sub
but I keep getting the error at debug
The node must be of type 'JsonObject'.'
on the line
Dim result As JsonObject = jsonResponse("result").AsObject
How it comes it gives an error If I'm already trying to parse it as a Jsonobject?
Thanks
Give a go at this..
Paste this into a new class file:
Namespace HotBit
Partial Public Class TradeCollection
<JsonProperty("error")>
Public Property [Error] As Object
<JsonProperty("result")>
Public Property Result As List(Of Result)
<JsonProperty("id")>
Public Property Id As Long
End Class
Partial Public Class Result
<JsonProperty("id")>
Public Property Id As Long
<JsonProperty("time")>
Public Property Time As Long
<JsonProperty("price")>
Public Property Price As String
<JsonProperty("amount")>
<JsonConverter(GetType(ParseStringConverter))>
Public Property Amount As Long
<JsonProperty("type")>
Public Property Type As TypeEnum
End Class
Public Enum TypeEnum
Buy
Sell
End Enum
Partial Public Class TradeCollection
Public Shared Function FromJson(ByVal json As String) As TradeCollection
Return JsonConvert.DeserializeObject(Of TradeCollection)(json, Settings)
End Function
End Class
Public Module Serialize
<Extension()>
Public Function ToJson(ByVal self As TradeCollection) As String
Return JsonConvert.SerializeObject(self, Settings)
End Function
End Module
Friend Module Converter
Public ReadOnly Settings As JsonSerializerSettings = New JsonSerializerSettings With {
.MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
.DateParseHandling = DateParseHandling.None
}
End Module
Friend Class ParseStringConverter
Inherits JsonConverter
Public Overrides Function CanConvert(ByVal t As Type) As Boolean
Return t Is GetType(Long) OrElse t Is GetType(Long?)
End Function
Public Overrides Function ReadJson(ByVal reader As JsonReader, ByVal t As Type, ByVal existingValue As Object, ByVal serializer As JsonSerializer) As Object
If reader.TokenType = JsonToken.Null Then Return Nothing
Dim value = serializer.Deserialize(Of String)(reader)
Dim l As Long
If Long.TryParse(value, l) Then
Return l
End If
Throw New Exception("Cannot unmarshal type long")
End Function
Public Overrides Sub WriteJson(ByVal writer As JsonWriter, ByVal untypedValue As Object, ByVal serializer As JsonSerializer)
If untypedValue Is Nothing Then
serializer.Serialize(writer, Nothing)
Return
End If
Dim value = CLng(untypedValue)
serializer.Serialize(writer, value.ToString())
Return
End Sub
Public Shared ReadOnly Singleton As ParseStringConverter = New ParseStringConverter()
End Class
Friend Class TypeEnumConverter
Inherits JsonConverter
Public Overrides Function CanConvert(ByVal t As Type) As Boolean
Return t Is GetType(TypeEnum) OrElse t Is GetType(TypeEnum?)
End Function
Public Overrides Function ReadJson(ByVal reader As JsonReader, ByVal t As Type, ByVal existingValue As Object, ByVal serializer As JsonSerializer) As Object
If reader.TokenType = JsonToken.Null Then Return Nothing
Dim value = serializer.Deserialize(Of String)(reader)
Select Case value
Case "buy"
Return TypeEnum.Buy
Case "sell"
Return TypeEnum.Sell
End Select
Throw New Exception("Cannot unmarshal type TypeEnum")
End Function
Public Overrides Sub WriteJson(ByVal writer As JsonWriter, ByVal untypedValue As Object, ByVal serializer As JsonSerializer)
If untypedValue Is Nothing Then
serializer.Serialize(writer, Nothing)
Return
End If
Dim value = CType(untypedValue, TypeEnum)
Select Case value
Case TypeEnum.Buy
serializer.Serialize(writer, "buy")
Return
Case TypeEnum.Sell
serializer.Serialize(writer, "sell")
Return
End Select
Throw New Exception("Cannot marshal type TypeEnum")
End Sub
Public Shared ReadOnly Singleton As TypeEnumConverter = New TypeEnumConverter()
End Class
End Namespace
Then install Newtonsoft (if not already) and Imports it
Then Imports HotBit (or if you changed the Namespace of the "paste this" above, Imports that new namespace
Then do your request and query the result e.g.:
Sub Main(args As String())
Dim s = New WebClient().DownloadString("https://api.hotbit.io/api/v1/market.deals?market=KIBA/USDT&limit=150&last_id=1521100930&api_key=44812d8f-66d3-01c0-94c3b29305040b03&sign=98EEC3D69D3F70F9BDFED901984B2AA4")
Dim tc = TradeCollection.FromJson(s)
Dim prices = String.Join(","c, tc.Result.Select(Function(r) r.Price))
End Sub

Newtonsoft JSON parsing into object

My VB is a bit rusty but I need to parse a JSON string. I did it already in C# where I didn't have an issue. This is an old project and I'm using VS2008 for it.
This is my class:
Public Class ResponseMeta
Private _type As String
<JsonProperty("type")> _
Public Property type() As String
Get
Return _type.ToString()
End Get
Set(ByVal value As String)
_type = value
End Set
End Property
Private _message As String
<JsonProperty("message")> _
Public Property message() As String
Get
Return _message
End Get
Set(ByVal value As String)
_message = value
End Set
End Property
Private _message_v1 As String
<JsonProperty("message-v1")> _
Public Property message_v1() As String
Get
Return _message_v1
End Get
Set(ByVal value As String)
_message_v1 = value
End Set
End Property
Private _message_v2 As String
<JsonProperty("message-v2")> _
Public Property message_v2() As String
Get
Return _message_v2
End Get
Set(ByVal value As String)
_message_v2 = value
End Set
End Property
Private _message_v3 As String
<JsonProperty("message-v3")> _
Public Property message_v3() As String
Get
Return _message_v3
End Get
Set(ByVal value As String)
_message_v3 = value
End Set
End Property
Private _message_v4 As String
<JsonProperty("message-v4")> _
Public Property message_v4() As String
Get
Return _message_v4
End Get
Set(ByVal value As String)
_message_v4 = value
End Set
End Property
End Class
The code to deserialize is:
Dim test As String
test = "{""response-meta"":{""type"":""S"",""message"":"""",""Total No Of Records"":"""",""message-v1"":""1"",""message-v2"":"""",""message-v3"":"""",""message-v4"":""""}}"
Dim testcl As ResponseMeta
testcl = JsonConvert.DeserializeObject(Of ResponseMeta)(test)
All properties of the object are set to Nothing and if I add watch, it says:
type = {"Object reference not set to an instance of an object."}
I have now spent countless hours on this and Google doesn't found a hint or a clue of what might be getting wrong here.
Any suggestions are very welcome.
The JSON does not match up to what you are trying to parse it to.
You are missing a root object.
Public Class RootObject
Private _root As ResponseMeta
<JsonProperty("response-meta")> _
Public Property ResponseMeta() As ResponseMeta
Get
Return _root
End Get
Set(ByVal value As ResponseMeta)
_root = value
End Set
End Property
End Class
So based on the JSON you would need to deserialize to root object first then get the meta data
Dim root As RootObject = JsonConvert.DeserializeObject(Of RootObject)(test)
Dim testcl As ResponseMeta = root.ResponseMeta

How to return two objects (including one list) in JSON with WCF

I am trying to resolve my issue.
This is my Service Contract (IService1.vb)
<OperationContract()> _
<WebInvoke(Method:="GET", BodyStyle:=WebMessageBodyStyle.Wrapped, ResponseFormat:=WebMessageFormat.Json, UriTemplate:="/GetBooks")> _
Function GetBooks() As List(Of Book)
<DataContract()> _
Class Book
Public Property bookchapter() As List(Of Chapter)
Get
Return m_bookchapter
End Get
Set(value As List(Of Chapter))
m_bookchapter = value
End Set
End Property
Private m_bookchapter As List(Of Chapter)
Public Property success() As Integer
Get
Return m_success
End Get
Set(value As Integer)
m_success = value
End Set
End Property
Private m_success As Integer
End Class
<DataContract()> _
Class Chapter
Public Property description() As String
Get
Return m_description
End Get
Set(value As String)
m_description = value
End Set
End Property
Private m_description As String
End Class
This is my Service (Service1.vb)
Public Function GetBooks() As List(Of IGPService.Book) Implements IGPService.GetBooks
Dim books As New List(Of IGPService.Book)
Dim newBook As IGPService.Book = New IGPService.Book
For i As Integer = 0 To 3
Dim newchapter As IGPService.Chapter = New IGPService.Chapter
newchapter.description = "Chapter1"
newBook.bookchapter.Add(newchapter)
Next
newBook.success = 1
books.Add(newBook)
Return books
End Function
When I call GetBooks, I get the following error:
The server encountered an error processing the request. See server
logs for more details.
I don't know what is wrong here. I couldn't find anything in the Windows EventLog.
I added a New() Contructor to the Book Class and now it works. But i don't know why!
Class Book
Public Property bookchapter() As List(Of Chapter)
Get
Return m_bookchapter
End Get
Set(value As List(Of Chapter))
m_bookchapter = value
End Set
End Property
Private m_bookchapter As List(Of Chapter)
Public Property success() As Integer
Get
Return m_success
End Get
Set(value As Integer)
m_success = value
End Set
End Property
Private m_success As Integer
**Public Sub New()
bookchapter = New List(Of Chapter)
End Sub**
End Class
I want to understand why this is. Can somebody explain me the difference with and without New()!

WebService Asp.Net Json not serialize a List(Of Class)

after a lot of time searching here and in the web, i'm posting my problem and my code for yours teach me how i do this works.
The problem is that the Json not serialize listUsuarios, when i use JavaScriptSerializer the return is "{}" and when i use JsonConvert.SerializeObject the return is "False".
Sorry for my bad english.
Here is the code...
USUARIOS.VB
Imports Microsoft.VisualBasic
Public Class Usuarios
Private _Codigo As Long
Private _Nome As String
Private _Telefone As String
Public Property Codigo As Integer
Get
Return _Codigo
End Get
Set(ByVal value As Integer)
_Codigo = value
End Set
End Property
Public Property Nome() As String
Get
Return _Nome
End Get
Set(ByVal value As String)
_Nome = value
End Set
End Property
Public Property Telefone() As String
Get
Return _Telefone
End Get
Set(ByVal value As String)
_Telefone = value
End Set
End Property
End Class
Public Class ListUsuarios
Private listUsuarios As List(Of Usuarios)
Public Sub New()
listUsuarios = New List(Of Usuarios)
End Sub
Public Sub AddItem(ByVal usuario As Usuarios)
listUsuarios.Add(usuario)
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
Public Function Item(ByVal Index As Integer) As Usuarios
Return CType(listUsuarios.Item(Index), Usuarios)
End Function
Public Function Count() As Integer
Return listUsuarios.Count
End Function
End Class
ANDROID.VB
Imports Newtonsoft.Json
Imports System.Configuration
Imports System.Data
Imports System.Data.OleDb
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Android
Inherits System.Web.Services.WebService
Dim Dt As DataTable
Dim Da As New OleDbDataAdapter
Dim Cmd As New OleDbCommand
Dim cn As New OleDb.OleDbConnection
<WebMethod()> _
Public Function Android(query As String) As String
Dim listUsuario As ListUsuarios = carregaDadosAccess(query)
Return retornaDadosJSON(listUsuario)
End Function
Private Function getConexaoDB() As OleDbConnection
Try
cn.ConnectionString = ConfigurationManager.ConnectionStrings("MyLocalAccess").ConnectionString
cn.Open()
Return cn
Catch ex As Exception
Throw ex
End Try
End Function
Private Sub closeConexaoDB(ByVal cn As OleDbConnection)
Try
If cn.State = ConnectionState.Open Then
cn.Close()
End If
Catch ex As Exception
Throw ex
End Try
End Sub
Private Function carregaDadosAccess(selectCommmand As String) As ListUsuarios
Dim usuario As Usuarios = Nothing
Dim listUsuario As New ListUsuarios
Dim i As Long = 0
Try
cn = getConexaoDB()
Dim da As New OleDb.OleDbDataAdapter(selectCommmand, cn)
Dim dt As New DataTable
Dim arrImage() As Byte = Nothing
Dim myMS As New IO.MemoryStream
da.Fill(dt)
If dt.Rows.Count > 0 Then
Do
usuario = New Usuarios
usuario.Codigo = dt.Rows(i).Item("key-codigo")
usuario.Nome = dt.Rows(i).Item("dad-descri")
usuario.Telefone = dt.Rows(i).Item("dad-telefo")
listUsuario.AddItem(usuario)
i = i + 1
If i = dt.Rows.Count Then Exit Do
Loop
Else
listUsuario = Nothing
End If
Catch ex As Exception
Throw ex
Finally
closeConexaoDB(cn)
End Try
Return listUsuario
End Function
Private Function retornaDadosJSON(listUsuario As ListUsuarios) As String
'Json serializer do prĂ³prio .net
'Dim JsonSerializer As New JavaScriptSerializer
'Return JsonSerializer.Serialize(listUsuario)
'Json serializer James Newton-King
Dim JsonSerializer As String = ""
Return JsonSerializer = JsonConvert.SerializeObject(listUsuario)
End Function
End Class
The first problem is you are returning a value that compares an empty string with the serialized json string and since the json serialized string is not empty. This is where the result of "False" is coming from.
You can fix that problem by changing the method to:
Private Function retornaDadosJSON(listUsuario As ListUsuarios) As String
Return JsonConvert.SerializeObject(listUsuario)
End Function
You can prevent this type of issue in the future by adding the following directives to the top of each file:
Option Explicit On
Option Strict On
or by setting the corresponding values in the project's Compile property page (you can also set these to default values for new projects in Visual Studio's Tools > Options > Projects and Solutions > VB Default).
Option Strict On would have prevented that code from compiling. It would also show you that there is a data type difference between _Codigo and Codigo (one is Long the other is Integer).
The second problem is that ListUsuarios isn't defined well for what you are trying to do with it. It would be much better to inherit from List(Of Usuarios) than your current design.
Changing to the following class will both reduce the code and ensure the data is serialized correctly:
Public Class ListUsuarios
Inherits List(Of Usuarios)
Public Sub AddItem(ByVal usuario As Usuarios)
Me.Add(usuario)
End Sub
End Class

DataContractJsonSerializer include object name in JSON object

I'm trying to serialize a JSON object so I can send it to a web service. I'm using this asp.net vb code:
Dim ser As DataContractJsonSerializer = New DataContractJsonSerializer(postData.GetType())
Dim MS As MemoryStream = New MemoryStream()
ser.WriteObject(MS, postData)
json = Encoding.UTF8.GetString(MS.ToArray())
which produces this JSON:
{"guid":"10049cf5-a622-4aa6-a1d5-58022c4e2a19"}
But what I NEED...is this JSON:
{"registerRequest": {"guid":"10049cf5-a622-4aa6-a1d5-58022c4e2a19"}}
here is the class definition for the object I'm trying to send:
Partial Public Class registerRequest
Private Property _guid As String
Public Property guid As String
Get
Return _guid
End Get
Set(value As String)
_guid = value
End Set
End Property
Sub New()
End Sub
End Class
How do I get the name of the class to appear in the JSON object as described above?
Add datacontractjsonserializersettings to your constructor on DataContractDataSerializer
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializersettings.emittypeinformation.aspx
Try using rootname setting in the constructor instead.
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializersettings.rootname.aspx
OK, to match the format I Just created a wrapper class with a "registerRequest" object inside of it. Kind of a work around, but it works!
Partial Public Class SerializedRegisterRequest
Private Property _registerRequest As registerRequest
Public Property registerRequest As registerRequest
Get
Return _registerRequest
End Get
Set(value As registerRequest)
_registerRequest = value
End Set
End Property
Sub New()
End Sub
End Class
Partial Public Class registerRequest
Private Property _guid As String
Public Property guid As String
Get
Return _guid
End Get
Set(value As String)
_guid = value
End Set
End Property
Sub New()
End Sub
End Class