using Newtonsoft.Json.Linq;
public static void Main()
CallApiMethodAndDumpResults(@"{""retCode"":0,""retMsg"":""OK"",""data"":41272}");
CallApiMethodAndDumpResults(@"{""retCode"":1000,""retMsg"":""No admin"",""data"":{}}");
private static void CallApiMethodAndDumpResults(string json)
Console.WriteLine("Simulated JSON response from server: " + json);
var command = new JsonCommand
ResponseToReturn = new PostResponse
Console.WriteLine("Deserializing into JsonResponse<int>...");
JsonResponse<int> resp = SendTypedApiRequest<int>(command, "", "");
Console.WriteLine("RetCode: " + resp.RetCode);
Console.WriteLine("RetMsg: " + resp.RetMsg);
Console.WriteLine("Data: " + resp.Data);
Console.WriteLine("response is null");
public static JsonResponse<T> SendTypedApiRequest<T>(JsonCommand command, string apiPath, string description, int expectedResponseCode = 0)
var r = SendPost(apiPath, command);
if (r.Code == OK && r.Response != null)
var settings = new JsonSerializerSettings();
settings.Converters.Add(new JsonResponseConverter());
var jsonResponse = JsonResponse<T>.Deserialize(r.Response, settings);
if (jsonResponse.RetCode != expectedResponseCode)
private static PostResponse SendPost(string apiPath, JsonCommand command)
return command.ResponseToReturn;
public class PostResponse
public int Code { get { return 200; } }
public string Response { get; set; }
public PostResponse ResponseToReturn { get; set; }
public class JsonResponse<T>
public int RetCode { get; set; }
public string RetMsg { get; set; }
public T Data { get; set; }
public static JsonResponse<T> Deserialize(string json, JsonSerializerSettings settings = null)
return JsonConvert.DeserializeObject<JsonResponse<T>>(json, settings);
public class JsonResponseConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(JsonResponse<>);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject obj = JObject.Load(reader);
JProperty dataProp = obj.Property("data");
if (dataProp != null) dataProp.Remove();
object jsonResponse = Activator.CreateInstance(objectType);
serializer.Populate(obj.CreateReader(), jsonResponse);
JObject data = new JObject(dataProp);
serializer.Populate(data.CreateReader(), jsonResponse);
catch (JsonException) { }
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();