#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. Похоже, вам просто нужно снять квадратные скобки.