【问题标题】:JSON.net SelectToken formattingJSON.net SelectToken 格式化
【发布时间】:2015-12-22 03:19:57
【问题描述】:

我有以下 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 相同的格式。

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

【问题讨论】:

    标签: c# json xml json.net


    【解决方案1】:

    使用 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
    

    可以在Here找到文档。

    【讨论】:

    • 谢谢。有没有办法通过 JObject 的 SelectToken 方法实现这一点?肯定有办法通过它来格式化字符串日期?
    • @macca18 我更新了答案。我不相信有办法直接用SelectToken 格式化日期。只有一种方法重载在令牌不匹配时允许出错。
    【解决方案2】:

    你应该这样写:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2013-11-07
      相关资源
      最近更新 更多