When building a response in WCF (json), im pretty sure it's not possible to use completely dynamic objects, but just wanted to double check here first.
An ideal response would look something like:
"userTypes" :
{
"BartSimpson" :
{
"url" : "foo",
"desc" : "bar"
},
"LisaSimpson" :
{
"url" : "foo",
"desc" : "bar"
}
}
In 'compiled' code, the above could be performed by the following architecture (slightly pseudocode):
public class Character{
string url {get;set;}
string desc{get;set;}
}
public class UserTypes{
public Character BartSimpson{get;set;}
public Character LisaSimpson{get;set;}
}
But my main goal is that BartSimpson
and LisaSimpson
are not 'compiled' so I could have any number of Character
classes, with any name / identifer in the response.
Add the following using
at the top of your service implementation class (make sure that you also add the proper references in your project):
using Newtonsoft.Json;
using System.Dynamic;
using System.IO;
using System.Text;
You may try this simple method which outputs the dynamic result:
public string GetData()
{
dynamic d = new ExpandoObject();
dynamic bartSimpson = new ExpandoObject();
dynamic lisaSimpson = new ExpandoObject();
bartSimpson.url = "foo";
bartSimpson.desc = "bar";
lisaSimpson.url = "foo";
lisaSimpson.desc = "bar";
d.userTypes = new ExpandoObject();
d.userTypes.BartSimpson = bartSimpson;
d.userTypes.LisaSimpson = lisaSimpson;
var s = JsonSerializer.Create();
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
s.Serialize(sw, d);
}
return sb.ToString();
}
To go one more step further (you'll just have to pass Bart and Lisa in the comaSeparatedNames
value), you could do:
public string GetData(string comaSeparatedNames)
{
string[] names = comaSeparatedNames.Split(',');
dynamic d = new ExpandoObject();
dynamic dNames = new ExpandoObject();
foreach (var name in names)
{
dynamic properties = new ExpandoObject();
properties.url = "foo";
properties.desc = "bar";
((IDictionary<string, object>)dNames).Add(name, properties);
}
((IDictionary<string, object>)d).Add("userTypes", dNames);
var s = JsonSerializer.Create();
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
s.Serialize(sw, d);
}
// deserializing sample
//dynamic dummy = new ExpandoObject();
//var instance = s.Deserialize(new StringReader(sb.ToString()),
// dummy.GetType());
//var foo = instance.userTypes.BartSimpson.url;
return sb.ToString();
}
Note: I've also provided the lines (commented) for deserialization.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With