Created
February 13, 2014 15:17
-
-
Save scottmcarthur/8976892 to your computer and use it in GitHub Desktop.
How to use a RequestBinder in ServiceStack (v4) to convert a complex JSON object into a request.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
using ServiceStack.Text; | |
using System.Collections.Generic; | |
using System.Runtime.Serialization; | |
using ServiceStack; | |
using ServiceStack.Web; | |
using System.Net; | |
namespace JsonTest | |
{ | |
class MainClass | |
{ | |
public static void Main() | |
{ | |
// Very basic console host | |
var appHost = new AppHost(500); | |
appHost.Init(); | |
appHost.Start("http://*:9000/"); | |
Console.ReadKey(); | |
} | |
} | |
public class AppHost : AppHostHttpListenerPoolBase | |
{ | |
public AppHost(int poolSize) : base("Merchant Service", poolSize, typeof(MerchantsService).Assembly) {} | |
public override void Configure(Funq.Container container) | |
{ | |
Func<IRequest, object> merchantsRequestBinder = delegate(IRequest request) { | |
var json = WebUtility.HtmlDecode( request.GetRawBody() ); | |
return new MerchantsRequest { MainMerchants = JsonSerializer.DeserializeFromString<Dictionary<int, Merchant>>(json) }; | |
}; | |
RequestBinders.Add(typeof(MerchantsRequest), merchantsRequestBinder); | |
Config = new HostConfig { | |
DebugMode = true, | |
}; | |
} | |
} | |
[Route("/Merchants", "POST")] | |
public class MerchantsRequest | |
{ | |
public Dictionary<int, Merchant> MainMerchants { get; set; } | |
} | |
public class MerchantsService : Service | |
{ | |
public void Post(MerchantsRequest request) | |
{ | |
var merchant39 = request.MainMerchants.First(p=>p.Key == 39).Value; | |
Console.WriteLine("Name: {0}\nImage: {1}\nProduct Count: {2}", merchant39.name, merchant39.image88x31, merchant39.products.Count); | |
var merchant40 = request.MainMerchants.First(p=>p.Key == 40).Value; | |
Console.WriteLine("Name: {0}\nImage: {1}\nProduct Count: {2}", merchant40.name, merchant40.image88x31, merchant40.products.Count); | |
} | |
} | |
public class Product | |
{ | |
public string status { get; set; } | |
public string type { get; set; } | |
public string code { get; set; } | |
public string end_date { get; set; } | |
public string title { get; set; } | |
public string url { get; set; } | |
public string text { get; set; } | |
public string long_title { get; set; } | |
} | |
/* | |
* Use DataMember to map the keys starting with numbers to an alternative c# compatible name. | |
* Unfortunately this requires properties to opt in to the data contract. | |
*/ | |
[DataContract] | |
public class Merchant | |
{ | |
[DataMember] | |
public string category { get; set; } | |
[DataMember] | |
public List<string> country_whitelist { get; set; } | |
[DataMember] | |
public string name { get; set; } | |
[DataMember] | |
public List<string> url_blacklist { get; set; } | |
[DataMember] | |
public List<string> country_blacklist { get; set; } | |
[DataMember] | |
public List<string> url_whitelist { get; set; } | |
[DataMember] | |
public Dictionary<int, Product> products { get; set; } | |
[DataMember] | |
public string sub_category { get; set; } | |
// This maps the 88x31 key to a c# appropriate name | |
[DataMember(Name = "88x31")] | |
public string image88x31 { get; set; } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment