sdk_csharp icon indicating copy to clipboard operation
sdk_csharp copied to clipboard

DraftPaymentCreate - Serialization of Pointer object - throws Token PropertyName in state Property would result in an invalid JSON object. when using custom JsonConverter<T>

Open Tieno opened this issue 4 years ago • 1 comments

Steps to reproduce:

  1. Try to create a draftpayment

What should happen:

  1. DraftPayment is created

What happens:

  1. Throws exception Token PropertyName in state Property would result in an invalid JSON object. when using custom JsonConverter<T>

Extra info:

[//]: # https://stackoverflow.com/questions/54441810/token-propertyname-in-state-property-would-result-in-an-invalid-json-object-whe

Error is located in BunqSdk/Json/MonetaryAccountReferenceConverter.cs

writer.WriteRaw(BunqJsonConvert.SerializeObject(monetaryAccountReference.Pointer));

should be changed to

writer.WriteRawValue(BunqJsonConvert.SerializeObject(monetaryAccountReference.Pointer));

Like below

/// <summary>
    /// Custom (de)serialization of MonetaryAccountReference required to provide compatibility between the two types
    /// used to refer to Monetary Accounts: Pointers in requests and Monetary Account Labels in responses.
    /// </summary>
    public class MonetaryAccountReferenceConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var monetaryAccountReference = (MonetaryAccountReference)value;

            if (monetaryAccountReference == null || monetaryAccountReference.Pointer == null)
            {
                writer.WriteNull();
            }
            else
            {
                     writer.WriteRawValue(BunqJsonConvert.SerializeObject(monetaryAccountReference.Pointer));
            }
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
            JsonSerializer serializer)
        {
            var jObject = JObject.Load(reader);
            var labelMonetaryAccount = BunqJsonConvert.DeserializeObject<LabelMonetaryAccount>(jObject.ToString());

            return new MonetaryAccountReference(labelMonetaryAccount);
        }

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(MonetaryAccountReference);
        }
    }

Tieno avatar Apr 25 '20 04:04 Tieno