Сериализовать и десериализовать из этого же класса с помощью Newtonsoft.Json.JsonConvert

#c# #json #xml #serialization #deserialization

Вопрос:

У меня проблема с тем, как создать одно определение класса для сериализации и десериализации объекта с тем же результатом.

Это определение класса :

  /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://hl7.org/fhir")]
    public partial class PatientName
    {

        private PatientNameFamily familyField;

        private PatientNameGiven givenField;

        /// <remarks/>
        public PatientNameFamily family
        {
            get
            {
                return this.familyField;
            }
            set
            {
                this.familyField = value;
            }
        }

        /// <remarks/>
        public PatientNameGiven given
        {
            get
            {
                return this.givenField;
            }
            set
            {
                this.givenField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://hl7.org/fhir")]
    public partial class PatientNameFamily
    {

        private string valueField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://hl7.org/fhir")]
    public partial class PatientNameGiven
    {

        private string valueField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }

[System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://hl7.org/fhir")]
    public partial class PatientNameFamily
    {

        private string valueField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://hl7.org/fhir")]
    public partial class PatientNameGiven
    {

        private string valueField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }

 

сериализовать правильно в XML, как показано ниже :

 <name>      
<family value="Senior"/>  
<given value="Sylwester"/>
</name>
 

но при попытке десериализации JSON : {"family": "Seniorka","given": [ "Sylwia" ]} ]
У меня есть исключение :

Ошибка преобразования значения «Seniorka» в тип ‘PlatformaP1ATD.ZM.Имя пациента Семейство, конечно , я могу изменить определение класса на строку и массив строк, но я не хочу, чтобы два класса сериализовались в xml и десериализовались из JSON.

Есть идеи, как преобразовать строковое значение во вложенный тип ?

Ответ №1:

Попробуйте следовать :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:temptest.xml";
        static void Main(string[] args)
        {
            Name name = new Name() { family = new Family() { value = "Senior" }, given = new Given() { value = "Sylwester" } };

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(FILENAME, settings);
            XmlSerializer serializer = new XmlSerializer(typeof(Name));
            serializer.Serialize(writer, name);
        }
    }
    [XmlRoot("name")]
    public class Name
    {
        public Family family { get; set; }
        public Given given { get; set; }
    }
    public class Family
    {
        [XmlAttribute()]
        public string value { get; set; }
    }
    public class Given
    {
        [XmlAttribute()]
        public string value { get; set; }
    }


}
 

Комментарии:

1. Объект в XML выглядит нормально , но из String jsonString = "{"family": "Seniorka","given": [ "Sylwia" ]} "; -за этой же ошибки

2. Похоже, вам просто нужно снять квадратные скобки.