【问题标题】:XML with special chars converting to Json in C#带有特殊字符的 XML 在 C# 中转换为 Json
【发布时间】:2020-03-13 21:59:02
【问题描述】:

我正在尝试将带有特殊字符(Tab)的 XML 转换为 Json 以获取以下 xml:

<Request>
 <HEADER>
    <uniqueID>2019111855545921230</uniqueID>
 </HEADER>
 <DETAIL>
<cmnmGrp>
  <coNm>IS XYZ INC.</coNm>
  <embossedNm>ANNA ST       UART</embossedNm>
  <cMNm>ST      UART/ANNA K</cMNm>
  <cmfirstNm>ANNA</cmfirstNm>
  <cmmiddleNm>K</cmmiddleNm>
  <cm2NdLastNm>ST       UART</cm2NdLastNm>
</cmnmGrp>
</DETAIL>
</Request>

我在 Json 中的输出低于:

{
  "Request": {
    "HEADER": { "uniqueID": "2019111855545921230" },
    "DETAIL": {
      "cmnmGrp": {
      "coNm": "IS XYZ INC.",
      "embossedNm": "ANNA ST\t\tUART",
      "cMNm": "ST\t\tUART/ANNA K",
      "cmfirstNm": "ANNA",
      "cmmiddleNm": "K",
      "cm2NdLastNm": "ST\t\tUART"
    }
  }
 }
}

以上响应包含特殊字符。如何删除制表符空格的 \t 。我正在使用以下代码进行 xml 到 Json 的转换:

var xml = @"Input xml";
XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml);

        string json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None);

我期待最终的 Json 输出如下:

{
  "Request": {
    "HEADER": { "uniqueID": "2019111855545921230" },
    "DETAIL": {
      "cmnmGrp": {
      "coNm": "IS XYZ INC.",
      "embossedNm": "ANNA ST        UART",
      "cMNm": "ST       UART/ANNA K",
      "cmfirstNm": "ANNA",
      "cmmiddleNm": "K",
      "cm2NdLastNm": "ST        UART"
    }
  }
 }
}

任何人都可以帮助解决这个问题。 谢谢。

【问题讨论】:

  • \t 是 JSON 转义选项卡的方式...我在这里没有发现任何问题。见stackoverflow.com/a/19176131/2957232
  • 不清楚你想要的最终结果是什么。标签完全删除?在转换之前修改 XML 文档可能是最简单的方法
  • 如果你想重新打开标签(我不明白为什么)你可以做类似json.Replace("\\t", "\t");
  • 请根据您的期望编辑问题,而不是使用 cmets。但从根本上说,在 JSON 中有一个文字选项卡和 \t 在所有解析器下应该是等效的。见tools.ietf.org/html/rfc8259#section-7

标签: c# json xml json.net


【解决方案1】:

不要混淆数据和表示!

ANNA ST\t\tUART - 是字符串“ANNA ST UART”的 JSON 表示形式。

现在做 JSON 解析,你会得到一个没有\t 的字符串。

var obj = JObject.Parse(json);
var value = obj["Request"]["DETAIL"]["cmnmGrp"]["embossedNm"];
Console.WriteLine(value); // ANNA ST  UART

【讨论】:

    【解决方案2】:

    \t 不仅仅是固定数量的空格,它取决于从行首开始的位置以及读者设置的最大制表符大小(通常为 8)。如果您希望它们出现在 JSON 中,就像它们出现在 XML 中一样,那么您必须以文本格式读取 XML 文件,并在转换为 JSON 之前根据它们的位置以编程方式将制表符替换为空格。假设您知道阅读器的最大标签大小:它可能是 4。

    下面是两个相同的行,具有相同的“abc\t”值,假设每个制表符最多 8 个空格:

    <value>abc      </value>
       <value>abc   </value>
    

    一般来说,保持密切关注是正确的,虽然它不适合你。

    JSON 规范将制表符定义为两个字符 \t,并且您的快照是正确的。如果您检索包含 \t 的值,则 JSON 解析器应将它们替换为制表符。取决于你需要什么;如果您不介意 XML 文件中的初始选项卡位置,您可能已经可以了。

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多