В моем приложении Xamarin.Forms мне нужно десериализовать JSon, предоставляемый APS. net MVC WebApi. Для этого я использую Newtonsoft. Json. Данные включают в себя производные классы
public abstract class PriceModel : ICloneable
[JsonConverter(typeof(PriceModelConverter))]
public class TimingPriceModel : PriceModel
[JsonConverter(typeof(PriceModelConverter))]
public class ChargingPriceModel : PriceModel
РЕДАКТИРОВАТЬ: Здесь я пытаюсь десериализовать:
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", access_token);
var json = await client.GetStringAsync(string.Format("ServerAdress", _zoneId));
var Customers = new List<Entities.Customer>();
try
{
JsonConverter[] converters = { new PriceModelConverter() };
Customers = JsonConvert.DeserializeObject<List<Entities.Customer>>(json, new JsonSerializerSettings() { Converters = converters });
}
Мой пользовательский конвертер это:
public class PriceModelConverter : JsonConverter
{
public override bool CanConvert(Type objectType) { return objectType == typeof(PriceModel);}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
if (reader.TokenType == JsonToken.StartArray)
{
var li = new List<PriceModel>();
var arr = JArray.Load(reader);
foreach (JObject obj in arr)
{
if (obj["ChargingPriceModel"] != null)
{
var k = obj.ToObject<ChargingPriceModel>(serializer);
li.Add(k);
}
if (obj["TimingPriceModel"] != null)
{
var k = obj.ToObject<TimingPriceModel>(serializer);
li.Add(k);
}
}
return li;
}
JObject jsonObject = JObject.Load(reader);
if (jsonObject["OverallCharges"] != null) return jsonObject.ToObject<ChargingPriceModel>(serializer);
if (jsonObject["Duration"] != null) return jsonObject.ToObject<TimingPriceModel>(serializer);
return null;
}
}
РЕДАКТИРОВАТЬ 2 : Хотя код теперь выполняется без перебоев, он попадает в исключение System.StackoverflowException. Я подозреваю, что бесконечный L oop - может быть, я не передам сериализатор методу toObject ()?
Я пытался выяснить это в течение последних двух дней, и это довольно красиво блокировка, поэтому любая помощь / совет приветствуется. Мой (уменьшенный) Json (от Почтальона) для набора данных такой:
[
{
"MembershipType": "Abo",
"ContactData": {
"Phone1": "Phone",
"Email": "Email"
},
"Lastname": "Client1Lastname",
"Firstname": "Client1Firstname",
"Gender": "f",
"PriceModel": {
"Duration": 12,
"TimebonusDays": 0,
"RegistrationFee": 0.0,
"TuitionFee": 45.0,
"Recurrence": {
"Id": 1,
"Name": "monthly",
"Englishname": "monthly"
},
"ModelType": "Time"
},
},
{
"MembershipType": "Block",
"ContactData": {
"Phone1": "Client2Phone",
"Email": "Client2Email"
},
"Lastname": "Client2LastName",
"Firstname": "Client2FirstName",
"Gender": "m",
"PriceModel": {
"OverallCharges": 10,
"ChargesLeft": 0,
"ChargesUsed": 10,
"ChargeDates": [
"2011-10-02T11:18:34",
],
"Recurrence": {
"Id": 2,
"Name": "advance",
"Englishname": "advance"
},
"ModelType": "Block"
},
}
]