Last active
April 14, 2017 22:59
-
-
Save FSou1/daeff50471419de025f7dab9c744df1c to your computer and use it in GitHub Desktop.
This file contains 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 Newtonsoft.Json; | |
using Newtonsoft.Json.Converters; | |
using Newtonsoft.Json.Linq; | |
using System; | |
using System.Collections.Generic; | |
namespace ConsoleApplication1 { | |
class Program { | |
static void Main(string[] args) { | |
const string response = @" | |
{ | |
contacts: [ | |
{ | |
type: ""email"", | |
value: ""hello@world.com"" | |
}, | |
{ | |
type: ""cell"", | |
value: { | |
code: ""+7"", | |
number: ""9779998877"", | |
countryId: 123 | |
} | |
}, | |
{ | |
type: ""vk_id"", | |
value: 12342341 | |
}] | |
} | |
"; | |
var resume = JsonConvert.DeserializeObject<Resume>(response, new ContactConverter()); | |
Console.WriteLine(JsonConvert.SerializeObject(resume, | |
new JsonSerializerSettings { | |
Formatting = Formatting.Indented | |
} | |
)); | |
} | |
} | |
public class ContactConverter : CustomCreationConverter<IContact> { | |
public override IContact Create(Type objectType) { | |
throw new NotImplementedException(); | |
} | |
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { | |
var jObject = JObject.Load(reader); | |
var target = CreateContact(jObject); | |
return target; | |
} | |
/// <summary> | |
/// Create concrete contact base on contactType value | |
/// </summary> | |
/// <param name="jObject"></param> | |
/// <returns></returns> | |
private IContact CreateContact(JObject jObject) { | |
var contactType = (string)jObject.Property("type"); | |
var json = jObject.ToString(); | |
switch (contactType) { | |
case "email": { | |
return DeserializeObject<EmailContact>(json); | |
} | |
case "cell": { | |
return DeserializeObject<PhoneContact>(json); | |
} | |
case "vk_id": { | |
return DeserializeObject<VkContact>(json); | |
} | |
default: | |
throw new NotSupportedException("Unexpected contactType: " + contactType); | |
} | |
} | |
private T DeserializeObject<T>(string json) => JsonConvert.DeserializeObject<T>(json); | |
} | |
public class Resume { | |
public IList<IContact> Contacts { get; set; } | |
} | |
public interface IContact { | |
string Type { get; set; } | |
} | |
public class EmailContact : IContact { | |
public string Type { get; set; } | |
public string Value { get; set; } | |
} | |
public class PhoneContact : IContact { | |
public string Type { get; set; } | |
public PhoneContactValue Value { get; set; } | |
} | |
public class VkContact : IContact { | |
public string Type { get; set; } | |
public int Value { get; set; } | |
} | |
public class PhoneContactValue { | |
public string Code { get; set; } | |
public string Number { get; set; } | |
public int CountryId { get; set; } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment