JSON.net SelectToken格式化

4

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

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

2个回答

2
使用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来完成此操作。

在这种情况下,我们首先将XML转换为JSON,使用JsonConvert.SerializeXMLNode(),然后我们可以像这样使用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

文档可以在这里找到。


谢谢。有没有办法通过JObject的SelectToken方法来实现这个?肯定有一种方法可以通过它来格式化字符串日期吧? - macca18
@macca18 我更新了答案。我不认为有一种直接使用SelectToken格式化日期的方法。只有一种方法重载允许在没有匹配令牌时出现错误。 - Dayan

0
你应该按照以下方式编写:
var eta = (string)jsonResponse.SelectToken("AgentBookingStatusResponse").SelectToken("Eta");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接