Ваша проблема заключается в том, что автоматическое DateTime
распознавание в Json.NET распознает, что строка "2019-10-25T07:00:00-05:00"
является действительной ISO 8601 датой и временем, и анализирует ее как DateTime
- который, к сожалению, не поддерживает спецификацию часового пояса. Таким образом, значение преобразуется (корректно) в местный часовой пояс на вашем компьютере во время десериализации и впоследствии форматируется как таковой в XML.
Чтобы предотвратить это, вам необходимо проанализировать JSON с помощью DateParseHandling.None
илиDateParseHandling.DateTimeOffset
, однако JsonConvert.DeserializeXmlNode
не имеет перегрузки, позволяющей передать этот параметр. Таким образом, вам потребуется создать метод расширения с необходимым аргументом:
public static partial class JsonExtensions
{
public static XmlDocument DeserializeXmlNode(string json, DateParseHandling dateParseHandling,
string deserializeRootElementName = null, bool writeArrayAttribute = false, bool encodeSpecialCharacters = false)
{
var settings = new JsonSerializerSettings
{
Converters =
{
new Newtonsoft.Json.Converters.XmlNodeConverter()
{
DeserializeRootElementName = deserializeRootElementName,
WriteArrayAttribute = writeArrayAttribute,
EncodeSpecialCharacters = encodeSpecialCharacters
}
},
DateParseHandling = dateParseHandling,
};
return JsonConvert.DeserializeObject<XmlDocument>(json, settings);
}
}
Затем используйте его следующим образом:
var xmlDoc = JsonExtensions.DeserializeXmlNode(jsonString, DateParseHandling.None);
Обратите внимание, что и DateParseHandling.None
, и DateParseHandling.DateTimeOffset
соответствуют вашим потребностям, так как первый отключает распознавание даты по ISO 8601, а второй анализирует такие строки в DateTimeOffset
, который поддерживает спецификацию часового пояса.
Кстати, эквивалентный метод для тех, кто предпочитает более новый XDocument
, равен:
public static partial class JsonExtensions
{
public static XDocument DeserializeXNode(string json, DateParseHandling dateParseHandling,
string deserializeRootElementName = null, bool writeArrayAttribute = false, bool encodeSpecialCharacters = false)
{
var settings = new JsonSerializerSettings
{
Converters =
{
new Newtonsoft.Json.Converters.XmlNodeConverter()
{
DeserializeRootElementName = deserializeRootElementName,
WriteArrayAttribute = writeArrayAttribute,
EncodeSpecialCharacters = encodeSpecialCharacters
}
},
DateParseHandling = dateParseHandling,
};
return JsonConvert.DeserializeObject<XDocument>(json, settings);
}
}
Демоскрипка здесь .