【问题标题】:return json from JsonConvert.SerializeXNode with proper type从具有正确类型的 JsonConvert.SerializeXNode 返回 json
【发布时间】:2015-02-25 11:25:08
【问题描述】:
var test = new
            {
                TestStr = "test",
                TestNumber = 123,
                TestDate = new DateTime(1986, 1, 13, 17, 50, 31),
                TestBool = true
            };

var xml = JsonConvert.DeserializeXNode(JsonConvert.SerializeObject(test), "test");

此代码返回漂亮的 xml 元素:

<test>
  <TestDate>1986-01-13T14:50:31Z</TestDate>
  <TestBool>true</TestBool>
  <TestNumber>123</TestNumber>
  <TestStr>test</TestStr>
</test>

当我尝试将此 xml 转换回 JSON

var json = JsonConvert.SerializeXNode(xml, Formatting.None, true);

我只获得带有 String 属性的 JSON。

我应该怎么做才能获得正确类型的 json?

【问题讨论】:

标签: c# xml json serialization json.net


【解决方案1】:

JSON 和 XML 是不同的序列化格式,具有不同的能力。 JSON 可以区分 stringnumberboolean,而 XML 将所有内容都视为字符串。因此,当您从 JSON 转换为 XML 并返回时,类型信息会丢失。处理此问题的一种方法是在来回转换时使用强类型中间模型。换句话说,不是直接从 XML 转换为 JSON,而是将您的 XML 反序列化为模型,然后将模型序列化为 JSON。该模型将强制数据为正确的类型。

这是一个例子:

class Program
{
    static void Main(string[] args)
    {
        string xml = @"
        <test>
          <TestDate>1986-01-13T14:50:31Z</TestDate>
          <TestBool>true</TestBool>
          <TestNumber>123</TestNumber>
          <TestStr>test</TestStr>
        </test>";

        XmlSerializer ser = new XmlSerializer(typeof(Test));
        Test test = (Test)ser.Deserialize(new StringReader(xml));
        string json = JsonConvert.SerializeObject(test, Formatting.Indented);
        Console.WriteLine(json);
    }
}

[XmlType("test")]
public class Test
{
    public string TestStr { get; set; }
    public int TestNumber { get; set; }
    public DateTime TestDate { get; set; }
    public bool TestBool { get; set; }
}

输出:

{
  "TestStr": "test",
  "TestNumber": 123,
  "TestDate": "1986-01-13T14:50:31Z",
  "TestBool": true
}

【讨论】:

  • 谢谢你,我喜欢你的回答,但“动态”是关键。我没有关于类型的信息。
  • 如果您没有关于类型的信息,那么您能做的最好的事情就是编写自定义代码来尝试根据数据值猜测类型。但是,这是有问题的,因为您可能会遇到值是数字但仍希望将其视为字符串的情况。一个很好的例子是美国邮政编码,在某些情况下它有一个前导零。自动将字符串转换为 int 会删除前导零并更改值。这就是为什么 Json.Net 在从 XML 转换为 JSON 时不会自动尝试猜测类型的原因。
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 2012-11-29
  • 2020-04-19
  • 1970-01-01
  • 2020-09-11
  • 2011-07-10
  • 2021-02-23
  • 2021-12-10
相关资源
最近更新 更多