JSON.net SelectToken formatting

本文关键字:formatting SelectToken net JSON | 更新日期: 2023-09-27 18:14:18

我有以下xml:-

<AgentBookingStatusResponse>
  <Eta>2012-11-19T15:40:15.0819269+00:00</Eta>
</AgentBookingStatusResponse>

我将其读入JObject,然后使用以下代码将其转换为字符串:

 var jsonString = JsonConvert.SerializeObject(_document);
 var jsonResponse = JObject.Parse(jsonString);
 var eta = (string) jsonResponse.SelectToken("AgentBookingStatusResponse.Eta") ?? null;

我得到的问题是,有一些隐式格式发生时这样做,因为eta的值:11/19/2012 15:40:15

我希望保持与XML相同的格式。

我如何完成这一点,如果我想将格式更改为英国时间,我该怎么做?

JSON.net SelectToken formatting

使用Newtonsoft的JSON.NET中的JsonConvert类执行以下操作。要获得JSON格式的数据,那么可以使用RootClass作为模板将其Deserialize到对象中。

最后执行CultureInfo.GetCultureInfo("en-GB")来获取英国的日期格式,然后显示它或做任何你想做的。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Xml;
using Newtonsoft.Json;
namespace ConsoleApplication1
{
    public class AgentBookingStatusResponse
    {
        public DateTime Eta { get; set; }
    }
    public class RootData
    {
        public AgentBookingStatusResponse AgentBookingStatusResponse { get; set; }
    }
    public class Program
    {
        static void Main(string[] args)
        {
          string testXMLData = @"<AgentBookingStatusResponse><Eta>2012-11-19T15:40:15.0819269+00:00</Eta></AgentBookingStatusResponse>";  
          XmlDocument doc = new XmlDocument();
          doc.LoadXml(testXMLData);
          string jsonText = JsonConvert.SerializeXmlNode(doc);
          //Deserialize to RootData Object
          var dataObj = JsonConvert.DeserializeObject<RootData>(jsonText);
          var datetime = new DateTime();
          datetime = Convert.ToDateTime(dataObj.AgentBookingStatusResponse.Eta);
          CultureInfo uk = CultureInfo.GetCultureInfo("en-GB");
          string ukDate = datetime.ToString("O", uk);
          Console.WriteLine(ukDate);
          Console.ReadKey();
        }
    }
}

jsonText输出:

{
    "AgentBookingStatusResponse": {
        "Eta": "2012-11-19T15:40:15.0819269+00:00"
    }
}

ukDate输出:

2012-11-19T10:40:15.0819269-05:00

我们也可以这样做,而不需要先从Newtonsoft JSON.NET中使用JObject来创建RootClass。

在这种情况下,我们将首先使用JsonConvert.SerializeXMLNode()将XML转换为JSON,然后我们可以像这样使用JObject.Parse()

  string testXMLData = @"<AgentBookingStatusResponse><Eta>2012-11-19T15:40:15.0819269+00:00</Eta></AgentBookingStatusResponse>";  
  //First we convert this XML to JSON
  var doc = new XmlDocument();
  doc.LoadXml(testXMLData);
  string jsonText = JsonConvert.SerializeXmlNode(doc);
  //Then we use JObject to parse the converted JSON data to an Object
  JObject jsonDataObj = JObject.Parse(jsonText);
  //Grab Token "Eta" and convert to DateTime Object
  var dateTimeToken = Convert.ToDateTime(jsonDataObj.SelectToken("AgentBookingStatusResponse.Eta"));
  //DateTime Object to a string with UK Culture information and proper Formatting
  var ukDateTime = dateTimeToken.ToString("O", CultureInfo.GetCultureInfo("en-GB"));

ukDateTime输出:

2012-11-19T10:40:15.0819269-05:00

文档可以在这里找到

你应该这样写:

var eta = (string)jsonResponse.SelectToken("AgentBookingStatusResponse").SelectToken("Eta");