簡體   English   中英

使用JsonConvert.SerializeObject的json.net在輸出中添加注釋

[英]json.net using JsonConvert.SerializeObject adds a comment to output

如何刪除創建的json字符串底部的注釋?

我正在嘗試使用Json.net將xml轉換為json。 具體來說,我是從Zillow API獲取數據的,該API返回XML,我需要將其作為json字符串傳遞到Web瀏覽器。 多虧了在此站點上找到的問題/答案,我才能夠在c#頁面中使用json.net進行轉換,但是...

我使用以下內容將xml轉換為json:

public String GetJson(XmlDocument xml)
{
    return Newtonsoft.Json.JsonConvert.SerializeObject(xml);
}

我成功獲取了json格式的String,但是此注釋已添加到json的底部(似乎是時間戳記)。

{
... json-formatted output...
/* H:011  T:134ms  S:1206  R:Tue May 02 07:59:03 PDT 2017  B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */
}

我已經檢查了原始的xml以確認注釋不存在,因此我得出結論說它是由json.net添加的。 我已經在這個網站(和Google)上搜索了有關此信息,但是我找不到合適的搜索標記來找到對此評論的任何提及。

謝謝!

序列化XmlDocument時,Json.NET不可能插入硬編碼的注釋 XmlNodeConverter根本沒有任何邏輯可以做到這XmlNodeConverter XmlNodeConverter唯一要寫注釋的時間是,如果在XML DOM層次結構中實際上遇到了XmlNodeType.Comment類型的XML節點,則在源代碼的第1502行處:

            case XmlNodeType.Comment:
                if (writePropertyName)
                {
                    writer.WriteComment(node.Value);
                }
                break;

因此,僅有幾種方法可以將這樣的注釋字符串添加到您的JSON輸出中,包括:

  1. Zillow API或您自己的應用程序在其代碼堆棧中的某些地方,實際上可能在XML中添加了注釋 例如,給定以下XML:

     <?xml version="1.0" encoding="utf-8" ?> <root> <childNode> <innerChildNode>Some Text</innerChildNode> </childNode> <!-- H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda --> </root> <!-- H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda --> 

    Json.NET將生成以下JSON:

     { "?xml": { "@version": "1.0", "@encoding": "utf-8" }, "root": { "childNode": { "innerChildNode": "Some Text" }/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */ }/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */ } 
  2. 在代碼堆棧中的某個位置,您的應用程序可能已在JsonConvert.DefaultSettings中安裝了自己的XmlNodeConverter版本,該版本XmlNodeConverter注釋插入到輸出中。 例如,給定以下全局轉換器:

     JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new FixedXmlNodeConverter() }, }; public class FixedXmlNodeConverter : Newtonsoft.Json.Converters.XmlNodeConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { base.WriteJson(writer, value, serializer); writer.WriteComment("Global Comment: H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda"); } } 

    生成的JSON將包含額外的注釋:

     { "?xml": { "@version": "1.0", "@encoding": "utf-8" }, "root": { "childNode": { "innerChildNode": "Some Text" }/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */ }/* H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda */ }/*Global Comment: H:011 T:134ms S:1206 R:Tue May 02 07:59:03 PDT 2017 B:5.0.42642-master.3acb9f9~hotfix_pre.b72ccda*/ 
  3. 您可能正在使用自己的Json.NET定制版本和XmlNodeConverter的定制版本。

示例小提琴演示了前兩種可能性。

如果您的XML中確實有注釋節點,則可以按照如何從XmlDocument刪除所有注釋標簽中的建議之一或其他類似問題來除去它們 如果安裝了全局轉換器,則可以通過手動分配XmlNodeConverter並將其傳遞給JsonConvert.SerializeObject()來替代它。

要處理這兩種情況,您的GetJson()可能變為:

    public String GetJson(XmlDocument xml)
    {
        XmlNodeList list = xml.SelectNodes("//comment()");
        foreach(XmlNode node in list)
        {
            node.ParentNode.RemoveChild(node);
        }

        var converter = new Newtonsoft.Json.Converters.XmlNodeConverter();
        // Use Newtonsoft.Json.Formatting.None in your production code
        return Newtonsoft.Json.JsonConvert.SerializeObject(xml, Newtonsoft.Json.Formatting.Indented, converter);
    }       

樣品提琴

如果您使用自己的自定義版本的Json.NET,則需要調查並修復發生這種情況的原因。

如果因任何原因,你不能修改傳入XmlDocument (或不能修復Json.NET的定制版本),你可以繼承JsonTextWriter和覆蓋WriteComment (也可能是WriteCommentAsync雖然我們在這里不會需要),並讓他們做什么:

public class NoCommentJsonTextWriter : JsonTextWriter
{
    public NoCommentJsonTextWriter(TextWriter writer)
        : base(writer)
    {
    }

    public override void WriteComment(string text)
    {
    }
}

然后按以下方式使用它:

    public String GetJson(XmlDocument xml)
    {
        var sb = new StringBuilder();
        using (var textWriter = new StringWriter(sb))
        // Use Newtonsoft.Json.Formatting.None in your production code
        using (var writer = new NoCommentJsonTextWriter(textWriter) { Formatting = Newtonsoft.Json.Formatting.Indented })
        {
            JsonSerializer.CreateDefault().Serialize(writer, xml);
        }
        return sb.ToString();
    }       

樣品提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM