JSonConvert Пользовательский преобразователь Проблема десериализации / System.StackoverflowException - PullRequest
0 голосов
/ 28 марта 2020

В моем приложении 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"
        },
}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...