JSON to XML

  • Михаил
  • 8 мин. на прочтение
  • 65
  • 13 Mar 2025
  • 13 Mar 2025

Чтобы преобразовать заданную структуру JSON в желаемый формат XML с помощью AutoMapper, вам нужно будет определить сопоставление между полями JSON и элементами XML. Вот пошаговое руководство о том, как этого добиться:

Определите исходную и конечную модели :

Создайте классы C#, представляющие исходную структуру JSON.
Создайте классы C#, представляющие целевую структуру XML.
Настройте AutoMapper :

Настройте конфигурацию сопоставления между исходной и целевой моделями.
Выполните картографирование :

Используйте AutoMapper для сопоставления исходных данных JSON с целевыми данными XML.
Сериализация в XML :

Используйте XML-сериализатор для преобразования целевой модели в XML-строку или файл.
Вот пример реализации:

Шаг 1: Определите исходную и конечную модели

// Source models representing the JSON structure
public class SourceRoot
{
   public List<SourceData> Values { get; set; }
}
public class SourceData
{
   public string Id { get; set; }
   public string Token { get; set; }
   public int Message { get; set; }
   public string Locality { get; set; }
   public string Object { get; set; }
   public DateTime DateTime { get; set; }
   public List<SourceParameter> Parameters { get; set; }
}
public class SourceParameter
{
   public string Id { get; set; }
   public string ParamKey { get; set; }
   public DateTime DateTime { get; set; }
   public string Unit { get; set; }
   public double Measure { get; set; }
   public string DataStructureId { get; set; }
}
// Destination models representing the XML structure
[XmlRoot("probes")]
public class DestinationProbes
{
   public List<DestinationParameter> Parameters { get; set; }
   public DestinationProbe Probe { get; set; }
}
public class DestinationParameter
{
   [XmlAttribute("code")]
   public string Code { get; set; }
   [XmlAttribute("name")]
   public string Name { get; set; }
}
public class DestinationProbe
{
   [XmlAttribute("comment")]
   public string Comment { get; set; }
   [XmlAttribute("file_period")]
   public int FilePeriod { get; set; }
   [XmlAttribute("number")]
   public string Number { get; set; }
   [XmlAttribute("period")]
   public int Period { get; set; }
   [XmlAttribute("type")]
   public string Type { get; set; }
   [XmlAttribute("datetime")]
   public string DateTime { get; set; }
   public DestinationControlPoint ControlPoint { get; set; }
   public List<DestinationResult> Results { get; set; }
}
public class DestinationControlPoint
{
   [XmlAttribute("address")]
   public string Address { get; set; }
   [XmlAttribute("code")]
   public string Code { get; set; }
   [XmlAttribute("lat")]
   public double Lat { get; set; }
   [XmlAttribute("lon")]
   public double Lon { get; set; }
   [XmlAttribute("name")]
   public string Name { get; set; }
}
public class DestinationResult
{
   [XmlAttribute("active")]
   public bool Active { get; set; }
   [XmlAttribute("alarm")]
   public bool Alarm { get; set; }
   [XmlAttribute("call")]
   public bool Call { get; set; }
   [XmlAttribute("code")]
   public string Code { get; set; }
   [XmlAttribute("status")]
   public string Status { get; set; }
   [XmlAttribute("stringvalue")]
   public string StringValue { get; set; }
   [XmlAttribute("decimalvalue")]
   public double DecimalValue { get; set; }
}

Шаг 2: Настройка AutoMapper

var config = new MapperConfiguration(cfg =>
{
   cfg.CreateMap<SourceRoot, DestinationProbes>()
      .ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => src.Values.SelectMany(v => v.Parameters)))
      .ForMember(dest => dest.Probe, opt => opt.MapFrom(src => src.Values.FirstOrDefault()));
   cfg.CreateMap<SourceParameter, DestinationParameter>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.ParamKey))
      .ForMember(dest => dest.Name, opt => opt.MapFrom(src => GetParameterName(src.ParamKey)));
   cfg.CreateMap<SourceData, DestinationProbe>()
      .ForMember(dest => dest.Comment, opt => opt.Ignore())
      .ForMember(dest => dest.FilePeriod, opt => opt.Ignore())
      .ForMember(dest => dest.Number, opt => opt.Ignore())
      .ForMember(dest => dest.Period, opt => opt.Ignore())
      .ForMember(dest => dest.Type, opt => opt.Ignore())
      .ForMember(dest => dest.DateTime, opt => opt.MapFrom(src => src.DateTime.ToString("yyyyMMddHHmmss")))
      .ForMember(dest => dest.ControlPoint, opt => opt.Ignore())
      .ForMember(dest => dest.Results, opt => opt.MapFrom(src => src.Parameters));
   cfg.CreateMap<SourceParameter, DestinationResult>()
      .ForMember(dest => dest.Active, opt => opt.UseValue(true))
      .ForMember(dest => dest.Alarm, opt => opt.UseValue(false))
      .ForMember(dest => dest.Call, opt => opt.UseValue(false))
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => GetResultCode(src.ParamKey)))
      .ForMember(dest => dest.Status, opt => opt.Ignore())
      .ForMember(dest => dest.StringValue, opt => opt.Ignore())
      .ForMember(dest => dest.DecimalValue, opt => opt.MapFrom(src => src.Measure));
});
var mapper = config.CreateMapper();

Шаг 3: Выполните картографирование

var sourceData = JsonConvert.DeserializeObject<SourceRoot>(jsonString);
var destinationData = mapper.Map<DestinationProbes>(sourceData);

Шаг 4: Сериализация в XML

var xmlSerializer = new XmlSerializer(typeof(DestinationProbes));
using (var stringWriter = new StringWriter())
{
   using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true }))
   {
       xmlSerializer.Serialize(xmlWriter, destinationData);
       var xmlString = stringWriter.ToString();
       File.WriteAllText("output.xml", xmlString);
   }
}

Вспомогательные методы

private string GetParameterName(string paramKey)
{
   switch (paramKey)
   {
       case "pressure": return "Атмосферное давление";
       case "temp": return "Температура";
       case "humid": return "Влажность";
       case "wind_speed": return "Скорость ветра";
       case "wind_dir": return "Направление ветра";
       // Add other mappings as needed
       default: return paramKey;
   }
}
private string GetResultCode(string paramKey)
{
   switch (paramKey)
   {
       case "pressure": return "3";
       case "temp": return "1";
       case "humid": return "2";
       case "wind_speed": return "4";
       case "wind_dir": return "5";
       // Add other mappings as needed
       default: return paramKey;
   }
}

Этот код сопоставит структуру JSON с желаемой структурой XML и сохранит ее в файле XML. Вы можете настроить сопоставления и вспомогательные методы по мере необходимости, чтобы они соответствовали вашим конкретным требованиям.