【问题标题】:Xml serializing dynamic string to booleanXml 将动态字符串序列化为布尔值
【发布时间】:2015-07-02 16:14:46
【问题描述】:

下面是一个简单的作业调度器实例,它将 xml 动态字符串解析为 json:

XML

<Navigations>
      <Navigation Name="facebook" Active ="0" ></Navigation>
</Navigations>

c#

List<NavigationData> nds = new List<NavigationData>();
foreach (object cnav in (IEnumerable)c.Navigations)
{
    NavigationData nd = new NavigationData();
    nd.Name = (string)((dynamic)cnav).Name;
    nd.Active = XmlConvert.ToBoolean((string)((dynamic)cnav).Active); // 3 
    nds.Add(nd);
}
transitContent.NavigationData = JsonConvert.SerializeObject(nds);

上面的程序在第 3 行抛出一个异常:

  1. 使用XMLConvert.ToBoolean将字符串转换为布尔值失败

  2. 无法识别带有Convert.ToBoolean的字符串

在这种情况下还可以进行其他类型转换吗?预期的结果应该是:

JSON

[
    {
        "Name": "facebook",
        "Active": false
    }
]

【问题讨论】:

  • 什么在解析 XML?从根本上说,您应该将值转换为 int,然后检查它是否非零,但可能有比您使用的方法更好的方法...
  • 要检查 null,我有这个:Active = (n.Attribute("Active") != null) ? n.Attribute("Active").Value : string.Empty
  • 那么您希望将缺失的属性视为活动还是非活动?您可能想将我的答案中的检查更改为“cnav.Active == "1"`

标签: c# json xml


【解决方案1】:

是的,“0”不是布尔值的有效值。听起来你可能想要这样的东西:

List<NavigationData> nds = new List<NavigationData>();
foreach (dynamic cnav in (IEnumerable)c.Navigations)
{
    NavigationData nd = new NavigationData();
    nd.Name = cnav.Name;
    nd.Active = cnav.Active != "0";
    nds.Add(nd);
}
transitContent.NavigationData = JsonConvert.SerializeObject(nds);

这是假设cnav 将所有属性公开为字符串(作为它们的执行时类型)。

【讨论】:

  • 在 xml:Active = "1" 中会发生什么?它会将其设置为true。我知道nd.Active 类型是布尔型
  • @Dev-One:那么"1" != "0" 会返回什么?
猜你喜欢
  • 2014-08-06
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2022-11-01
  • 1970-01-01
  • 2013-11-09
  • 2021-09-07
相关资源
最近更新 更多