A liitle help on submitting a json array, no-primitive to a web service
-
This is the first time that I am submitting a array of data to a web service, sort of in reverse. So a web service can only accept primitive values, I get it. I want to pick up a json array of values, but not sure how to go about it. So here's the layout. JSON input
{
"template_Name": "tshirts",
"template_Array": [
{
"name": "Red",
"code": "RED"
},
{
"name": "Green",
"code": "GRN"
},
{
"name": "Blue",
"code": "BLU"
},
{
"name": "Black",
"code": "BLK"
},
{
"name": "White",
"code": "WHT"
}
]
}And the Function declaration of the Web Service
_
Public Function create_DynamicCart_Template(
ByVal template_Name As String,
ByVal template_Array() As String) As StringDim dwExitCode As Integer = 2 Dim json\_response As StringBuilder = New StringBuilder Dim html\_Stream As String = Nothing
So because the template_Array() contains the array marker, it's not a primitive. I read that I have to consume the web service in another application, or perhaps I just take out the array () chars, and swallow it as a char array. Maybe make a class that represents the array, template_Array As TA, Any suggestions?,
Well that was hard, especially finding info on it in vb, everything was c#, so I had to translate it. Wrote this at 1:30, but had to take a service call. Just got back to test it. So a list of template_Elements, qualifies as a primitive, or it simply consumes the web method before processing, and passes on the json array for my manipulation. If you've got insight into this, let me know, would like to learn more about it. I'm going to try to parse the JSON back into an array, and write out some XML with it, hope it works, or I'm back to the drawing board.
_
Public Function create_DynamicCart_Template(
ByVal template_Name As String,
ByVal template_Array As List(Of templateElements)) As StringDim dwExitCode As Integer = 2 Dim json\_response As StringBuilder = New StringBuilder Dim html\_Stream As String = Nothing Try Dim jss As JavaScriptSerializer = New JavaScriptSerializer() Dim elements = jss.Deserialize(Of List(Of templateElements))(template\_Array.ToString)
Then the class
Public Class templateElements
Private privateName As String Public Property Name() As String Get Return privateName End Get Set(ByVal value As String) privateName = value End Set End Property Private privateCode As String Public Property Code() As String Get Return privateCode End Get Set(ByVal value As String) privateCode = value End Set End Property
End Class
-
This is the first time that I am submitting a array of data to a web service, sort of in reverse. So a web service can only accept primitive values, I get it. I want to pick up a json array of values, but not sure how to go about it. So here's the layout. JSON input
{
"template_Name": "tshirts",
"template_Array": [
{
"name": "Red",
"code": "RED"
},
{
"name": "Green",
"code": "GRN"
},
{
"name": "Blue",
"code": "BLU"
},
{
"name": "Black",
"code": "BLK"
},
{
"name": "White",
"code": "WHT"
}
]
}And the Function declaration of the Web Service
_
Public Function create_DynamicCart_Template(
ByVal template_Name As String,
ByVal template_Array() As String) As StringDim dwExitCode As Integer = 2 Dim json\_response As StringBuilder = New StringBuilder Dim html\_Stream As String = Nothing
So because the template_Array() contains the array marker, it's not a primitive. I read that I have to consume the web service in another application, or perhaps I just take out the array () chars, and swallow it as a char array. Maybe make a class that represents the array, template_Array As TA, Any suggestions?,
I dealt with this problem just yesterday. I found a really really convenient way to that. But I am horrible with VB.Net otherwise I could have helped you out. Do you think if I post the C# code, you would be able to figure the VB.Net version of it? Btw, my methods only works with .Net Framework 3.0 and above. Is that what you use? If it's 4.0 I can give you a very easy method :)
-
I dealt with this problem just yesterday. I found a really really convenient way to that. But I am horrible with VB.Net otherwise I could have helped you out. Do you think if I post the C# code, you would be able to figure the VB.Net version of it? Btw, my methods only works with .Net Framework 3.0 and above. Is that what you use? If it's 4.0 I can give you a very easy method :)
Sure, I can translate with no problem I did it working last night, I was surprised at what the fix was, and was able to generate my xml file. Would like to see what you came up with, because I think I'm going to use more of this in the future, it's pretty cool.
-
Sure, I can translate with no problem I did it working last night, I was surprised at what the fix was, and was able to generate my xml file. Would like to see what you came up with, because I think I'm going to use more of this in the future, it's pretty cool.
Hey there, Glad it worked out. Post your method here as well, so I can see whether I can improve my solution :) ExpandoObject Documentation[^] JSON Library[^] that I used
// This only works in .NET 4.0
dynamic result = new ExpandoObject();
IDictionary resultData = (IDictionary)result;resultData.add("templateName", "tshirts");
var templateArray = new [] {
new { Name = "Red", Code = "RED" },
new { Name = "Green", Code = "GRN" },
new { Name = "Blue", Code = "BLU" }
};resultData.add("templateArray", templateArray);
string jsonString = JsonConvert.SerializeObject(result);
This will output a JSON string like the one you initially mentioned. I think the code is self explanatory. Feel free to reach out for further clarifications. Hope this helps, cheers
-
Hey there, Glad it worked out. Post your method here as well, so I can see whether I can improve my solution :) ExpandoObject Documentation[^] JSON Library[^] that I used
// This only works in .NET 4.0
dynamic result = new ExpandoObject();
IDictionary resultData = (IDictionary)result;resultData.add("templateName", "tshirts");
var templateArray = new [] {
new { Name = "Red", Code = "RED" },
new { Name = "Green", Code = "GRN" },
new { Name = "Blue", Code = "BLU" }
};resultData.add("templateArray", templateArray);
string jsonString = JsonConvert.SerializeObject(result);
This will output a JSON string like the one you initially mentioned. I think the code is self explanatory. Feel free to reach out for further clarifications. Hope this helps, cheers
Oh, that's pretty slick. I built my json the old fashioned way using string builder. I just caught the net4.0 comment, using 2.0 on this project. I was just fine tuning my function to correct the first record error being sort of blank.
_
Public Function create_DynamicCart_Template(
ByVal template_Name As String,
ByVal template_Array() As templateElements) As StringDim dwExitCode As Integer = 2 'An unknown error has occured Dim json\_response As StringBuilder = New StringBuilder Try Dim bTemplates As Boolean = DoesFoldersExist("~/App\_Data/Products/dynamicItems/templates") Dim bDisplay As Boolean = DoesFoldersExist("~/App\_Data/Products/pageDisplay") 'Create the First Record Dim new\_Template As dynamicItem3.template = New dynamicItem3.template Dim new\_Element1 As dynamicItem3.templateElement\_1 = New dynamicItem3.templateElement\_1 new\_Element1.Name = template\_Array(0).Name new\_Element1.suffix = template\_Array(0).Code If (template\_Array(0).Type.ToUpper = "SIMPLE") Then new\_Element1.elementType = dynamicItem3.templateElement\_1ElementType.Simple Else new\_Element1.elementType = dynamicItem3.templateElement\_1ElementType.Complex End If Dim new\_Element1\_Record() As dynamicItem3.templateElement\_1 = {new\_Element1} Dim new\_Element1\_Record\_Count As Integer = 0 'Now Build the rest of the records For i As Integer = 1 To template\_Array.Length - 1 'Build the XML Array from the JSON Array Array.Resize(new\_Element1\_Record, new\_Element1\_Record.Length + 1) new\_Element1\_Record(new\_Element1\_Record.Length - 1) = New dynamicItem3.templateElement\_1 new\_Element1\_Record(new\_Element1\_Record.Length - 1).Name = template\_Array(i).Name new\_Element1\_Record(new\_Element1\_Record.Length - 1).suffix = template\_Array(i).Code If (template\_Array(i).Type.ToUpper = "SIMPLE") Then new\_Element1\_Record(new\_Element1\_Record.Length - 1).elementType = dynamicItem3.templateElement\_1ElementType.Simple Else new\_Element1\_Record(new\_Element1\_Record.Length - 1).elementType = dynamicItem3.templateElement\_1ElementType.Complex End If new\_Element1\_Record\_Count += 1
-
Oh, that's pretty slick. I built my json the old fashioned way using string builder. I just caught the net4.0 comment, using 2.0 on this project. I was just fine tuning my function to correct the first record error being sort of blank.
_
Public Function create_DynamicCart_Template(
ByVal template_Name As String,
ByVal template_Array() As templateElements) As StringDim dwExitCode As Integer = 2 'An unknown error has occured Dim json\_response As StringBuilder = New StringBuilder Try Dim bTemplates As Boolean = DoesFoldersExist("~/App\_Data/Products/dynamicItems/templates") Dim bDisplay As Boolean = DoesFoldersExist("~/App\_Data/Products/pageDisplay") 'Create the First Record Dim new\_Template As dynamicItem3.template = New dynamicItem3.template Dim new\_Element1 As dynamicItem3.templateElement\_1 = New dynamicItem3.templateElement\_1 new\_Element1.Name = template\_Array(0).Name new\_Element1.suffix = template\_Array(0).Code If (template\_Array(0).Type.ToUpper = "SIMPLE") Then new\_Element1.elementType = dynamicItem3.templateElement\_1ElementType.Simple Else new\_Element1.elementType = dynamicItem3.templateElement\_1ElementType.Complex End If Dim new\_Element1\_Record() As dynamicItem3.templateElement\_1 = {new\_Element1} Dim new\_Element1\_Record\_Count As Integer = 0 'Now Build the rest of the records For i As Integer = 1 To template\_Array.Length - 1 'Build the XML Array from the JSON Array Array.Resize(new\_Element1\_Record, new\_Element1\_Record.Length + 1) new\_Element1\_Record(new\_Element1\_Record.Length - 1) = New dynamicItem3.templateElement\_1 new\_Element1\_Record(new\_Element1\_Record.Length - 1).Name = template\_Array(i).Name new\_Element1\_Record(new\_Element1\_Record.Length - 1).suffix = template\_Array(i).Code If (template\_Array(i).Type.ToUpper = "SIMPLE") Then new\_Element1\_Record(new\_Element1\_Record.Length - 1).elementType = dynamicItem3.templateElement\_1ElementType.Simple Else new\_Element1\_Record(new\_Element1\_Record.Length - 1).elementType = dynamicItem3.templateElement\_1ElementType.Complex End If new\_Element1\_Record\_Count += 1
Woahh.. That's one long solution :omg: I think you can simplify that solution by compiling the logic into one class using a dictionary object or a stringbuilder object internally to hold the data. I will post a sample, if I get time around one of these days.
-
Woahh.. That's one long solution :omg: I think you can simplify that solution by compiling the logic into one class using a dictionary object or a stringbuilder object internally to hold the data. I will post a sample, if I get time around one of these days.
-
I thought it was pretty optimized, considering it building a XML file, and writing it to disk.
Hey there, I am sorry about the really late reply. But I've been working with web technologies and XML manipulation much. One thing I've learnt is that XML is great for data transferring but it's slow and heavy. For instance, if you want to send one piece of data that is huge XML is fine. But if you want to send lots of small pieces of data, the number of tags generated for each small object, adds an unnecessary weight. I hope this gives you the basic idea of what I mean. I won't have time to write a fully generalized JSON class :( But it should be really easy to write a logic to generalize your specific class without using XML. Let me know if you still want it. Basic idea for it would be to implement an interface on all the classes you want to JSONify (I made that word up :P) and pass it on to a special class. The implementation of the interface would return a JSON data string for that specific object. The special class would bind them all to one piece of data. Hope this helps, Regards
-
Hey there, I am sorry about the really late reply. But I've been working with web technologies and XML manipulation much. One thing I've learnt is that XML is great for data transferring but it's slow and heavy. For instance, if you want to send one piece of data that is huge XML is fine. But if you want to send lots of small pieces of data, the number of tags generated for each small object, adds an unnecessary weight. I hope this gives you the basic idea of what I mean. I won't have time to write a fully generalized JSON class :( But it should be really easy to write a logic to generalize your specific class without using XML. Let me know if you still want it. Basic idea for it would be to implement an interface on all the classes you want to JSONify (I made that word up :P) and pass it on to a special class. The implementation of the interface would return a JSON data string for that specific object. The special class would bind them all to one piece of data. Hope this helps, Regards
That's OK on the late reply, it's a discussion, and I got it working using a class with get and set to accept a JSON array of items. So I understand how to pass non-primitives to a web service now. I find XML to be really fast. I use XML reader and writer, and a class file to code against. So basically each xml element is like an array, that can be resized with Array.resize. And yes it does help solidify the techniques needed to accomplish the task. Thanks for collaborating with me on the subject. Guess not that many people are at that level yet.
-
That's OK on the late reply, it's a discussion, and I got it working using a class with get and set to accept a JSON array of items. So I understand how to pass non-primitives to a web service now. I find XML to be really fast. I use XML reader and writer, and a class file to code against. So basically each xml element is like an array, that can be resized with Array.resize. And yes it does help solidify the techniques needed to accomplish the task. Thanks for collaborating with me on the subject. Guess not that many people are at that level yet.
hehe :) It's my pleasure to have a good discussion and help someone out. XML is not slow for your eye, but it's really slow when it comes to traversing the nodes (i.e. compared to others of course). Anyways, am sure for your purpose it won't effect much. However I'll try to write a sample code that would perform json serialization easily, over the weekend, and share it. regards
-
hehe :) It's my pleasure to have a good discussion and help someone out. XML is not slow for your eye, but it's really slow when it comes to traversing the nodes (i.e. compared to others of course). Anyways, am sure for your purpose it won't effect much. However I'll try to write a sample code that would perform json serialization easily, over the weekend, and share it. regards