How Do I Configure Json.NET Custom Serialization?

后端 未结 3 599
有刺的猬
有刺的猬 2021-01-21 04:47

For reasons beyond my control, I have data coming back from an external service being formatted as an array of array of string: [[\"string_one\", \"string_two\"]]

相关标签:
3条回答
  • 2021-01-21 05:20

    Ended up implementing this using a JsonConverter. I changed MyObject to look like:

    [JsonConverter(typeof(MyObjectConverter))]
    public class MyObject
    {
        public string PropertyOne { get; set; }
        public string PropertyTwo { get; set; }
    }
    

    And then implemented MyObjectConverter:

    public class MyObjectConverter : JsonConverter
    {
        public override object ReadJson (JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
        {
            int pos = 0;
            string[] objectIdParts = new string[2];
    
            while (reader.Read())
            {
                if (pos < 1)
                {
                    if (reader.TokenType == JsonToken.String)
                    {
                        objectIdParts[pos] = reader.Value.ToString();
                        pos++;
                    }
                }
                // read until the end of the JsonReader
            }
    
            return new MyObject(objectIdParts);
        }
    
        public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException ();
        }
    
        public override bool CanWrite {
            get {
                return base.CanWrite;
            }
        }
    
        public override bool CanRead { get { return true; } }
        public override bool CanConvert (Type objectType) 
        {
            return true;
        }
    }
    
    0 讨论(0)
  • 2021-01-21 05:37

    There is quite a big discrepancy between your target object and the JSON. You could do the mapping manually:

    string json = "[[\"string_one\", \"string_two\"]]";
    dynamic result = JsonConvert.DeserializeObject(json);
    var myObject = new MyObject
    {
        PropertyOne = result[0][0],
        PropertyTwo = result[0][1]
    };
    
    0 讨论(0)
  • 2021-01-21 05:37

    Honestly, I'd just deserialize it as string[][] and map that within your domain layer. The amount of time you'll spend messing around with custom serialization is rarely worth it.

    0 讨论(0)
提交回复
热议问题