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 сборка не предоставляет запрошенную функцию, поэтому я изменил исходный код, чтобы обеспечить эту функциональность:
эта модификация предоставляет 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"
}