Deserialize JSON to 2 different models

前端 未结 9 1360
眼角桃花
眼角桃花 2021-02-06 23:42

Does Newtonsoft.JSON library have a simple way I can automatically deserialize JSON into 2 different Models/classes?

For example I get the JSON:

[{
  \"g         


        
9条回答
  •  自闭症患者
    2021-02-07 00:04

    You could make a type to house the two subobjects:

    [JsonConverter(typeof(GuardianPatientConverter))]
    class GuardianPatient
    {
        public Guardian Guardian { get; set; }
        public Patient Patient { get; set; }
    }
    

    And then create a JSON converter to handle the JSON:

    class GuardianPatientConverter : JsonConverter
    {
        public override bool CanRead
        {
            get { return true; }
        }
    
        public override bool CanWrite
        {
            get { return false; }
        }
    
        public override bool CanConvert(Type objectType)
        {
            return typeof(GuardianPatient) == objectType;
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return null;
            }
    
            var jObject = JObject.Load(reader);
            var guardian = new Guardian();
            var patient = new Patient();
            serializer.Populate(jObject.CreateReader(), guardian);
            serializer.Populate(jObject.CreateReader(), patient);
            return new GuardianPatient()
            {
                Guardian = guardian,
                Patient = patient
            };
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    

    And then you can use it like so:

    var json = "[{\"guardian_id\":\"1453\",\"guardian_name\":\"Foo Bar\",\"patient_id\":\"938\",\"patient_name\":\"Foo Bar\",}]";
    var objects = JsonConvert.DeserializeObject>(json);
    

    and if you want it as an array of pairs:

    var objects = JsonConvert.DeserializeObject>(json)
        .Select(o => new Pair(o.Guardian, o.Patient))
        .ToArray();
    

    This won't make it any faster, but I suspect you're looking for an easier way to work with the JSON.

提交回复
热议问题