2

我必须将一些数据从 C# 模块传递到 Java 脚本模块。

现在,有一个我无法控制的中间人模块,最终会调用 external(c#) 模块,并返回一个 xml 结构,其中来自 c# 模块的数据位于 XML 属性中。

我试着放一个 JSON 字符串,"\/Date(1350323947917)\/"

来自

    DateTime dt = DateTime.Now;

    JavaScriptSerializer serailzer = new JavaScriptSerializer();
    string dateTimeString = serailzer.Serialize(dt);

而且它不适合作为有效 XML 的属性。

我可以尝试做的是修剪字符串末尾的引号,但我不确定这是否会使 JSON 无效

我的问题是,我应该尝试继续使用这个 JSON 路由,还是有其他我遗漏的陷阱?

编辑: 我想重申,生成 XML 的不是我的程序。

4

3 回答 3

6

JSON 必须是 UTF-8,所以只要你使用 UTF-8 编码的 XML,就可以了。只需确保正确转义 json 以在属性中使用即可。您需要转义的唯一四个字符是<, >, &, ,"它们被转义为&lt;,&gt;和.&amp;&quot;

CDATA 有问题。您仍然必须转义某些序列,并且由于 json 和 xml 都应该是有效的 UTF-8,因此不使用 CDATA 时的风险较小。您想要的是 SGML 所称的 PCDATA,这正是标准文本属性或 xml nodeValue 的内容。

因此,您的问题的答案只是为容器转义您的数据(无论它可能是什么)。在这种情况下,它是 xml。

于 2012-10-15T21:02:59.723 回答
3

您可以使用 System.Security.SecurityElement 类来转义字符。

    /// <summary>
    /// Escapes Json string to be included in an XML attribute
    /// </summary>
    /// <param name="jsonString">json string</param>
    /// <returns></returns>
    public static string EscapeJson(string jsonString)
    {
        return SecurityElement.Escape(jsonString);
    }

    /// <summary>
    /// Unescapes Json string from XML attribute value
    /// </summary>
    /// <param name="xmlString">xml string</param>
    /// <returns></returns>
    public static string UnescapeJson(string xmlString)
    {
        return new SecurityElement("", xmlString).Text;
    }
于 2017-08-31T18:10:27.660 回答
-1

1)您需要正确拼写“serializer”,否则它将不起作用:)

2) 您需要将您的 JSON 数据包含在“CDATA”部分中,以便您的 XML 文件正确保存它。

3) 以下是一些从 C# 编写 CDATA 的链接:

于 2012-10-15T19:00:09.007 回答