Force JsonConvert.SerializeXmlNode сериализовать значение узла как целое число или булево

на С Newtonsoft.Json.JsonConvert класс всегда выводит значение последних дочерних узлов XML в виде строкового типа в процессе сериализации, когда иногда может потребоваться их сериализация в виде целого числа или логического.

пример кода:

<Object>
  <ID>12</ID>
  <Title>mytitle</Title>
  <Visible>false</Visible>
</Object>

выход:

{ "ID" : "12",
  "Title" : "mytitle",
  "Visible" : "false"
}

желаемый результат:

{ "ID" : 12,
  "Title" : "mytitle",
  "Visible" : false
}

есть ли способ заставить XML-узел сериализоваться как целое число или логическое значение?

спасибо вы.

Примечание: пожалуйста, избегайте размещения обходных путей, когда XML уже сериализован в строку JSON, так как эти обходные пути являются теми, которые мы готовы избежать.

2 ответов


JSON.NET не является инструментом для сериализации XML. Сериализация узлов XML предназначена для обеспечения однозначного соответствия между XML и JSON. Поскольку атрибуты в XML могут иметь только тип string, сведения о типе не сохраняются во время сериализации. Это будет бесполезно при десериализации обратно в JSON.

Если вам нужно преобразовать XML в JSON, я предлагаю использовать класс DTO, который поддерживает как XML, так и сериализацию JSON.

[XmlRoot ("Object"), JsonObject]
public class Root
{
    [XmlElement, JsonProperty]
    public int Id { get; set; }

    [XmlElement, JsonProperty]
    public string Title { get; set; }

    [XmlElement, JsonProperty]
    public bool Visible { get; set; }
}

десериализовать из XML и затем сериализовать в JSON:

public class Program
{
    private const string xml = @"
        <Object>
          <Id>12</Id>
          <Title>mytitle</Title>
          <Visible>false</Visible>
        </Object>";

    private static void Main ()
    {
        var serializer = new XmlSerializer(typeof(Root));
        var root = (Root)serializer.Deserialize(new StringReader(xml));
        Console.WriteLine(JsonConvert.SerializeObject(root, Formatting.Indented));
        Console.ReadKey();
    }
}

выход:

{
  "Id": 12,
  "Title": "mytitle",
  "Visible": false
}

текущий JSON.NET сборка не предоставляет запрошенную функцию, поэтому я изменил исходный код, чтобы обеспечить эту функциональность:

https://github.com/lukegothic/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs

эта модификация предоставляет XmlNodeConverter способ чтения необязательного атрибута из узлов XML под названием "Type", который содержит требуемую сериализацию значения узла. По умолчанию преобразователь сериализует все значения как строку в строке результата JSON, но теперь можно добавить атрибут, указывающий желаемый вывод типа данных. Разрешенными типами являются Integer, Float, Boolean и Date.

например, если у вас есть этот исходный XML:

<Object>
  <ID json:Type='Integer'>12</ID>
  <Title>mytitle</Title>
  <Visible json:Type='Boolean'>false</Visible>
  <Price json:Type='Float'>1.55</Price>
  <ExpirationDate json:Type='Date'>2013-12-31</ExpirationDate>
</Object>

он будет сериализован как:

{
    "ID":12,
    "Title":"mytitle",
    "Visible":false,
    "Price":1.55,
    "ExpirationDate":"2013-12-31T00:00:00"
}