2017-05-02 95 views
0

如何刪除創建的json字符串底部的註釋?json.net使用JsonConvert.SerializeObject添加註釋輸出

我正在嘗試使用Json.net將xml轉換爲json。具體來說,我從Zillow API中獲取數據,該數據返回需要作爲json字符串傳遞給Web瀏覽器的XML。由於在此網站上發現的問題/答案,我已經能夠使用json.net在我的C#頁面MAKET轉換,但是......

我用下面的我的XML轉換成JSON:

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

我成功地得到了一個json格式的字符串,但是這個註釋被添加在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添加的。我已經搜索過這個網站 - 和谷歌 - 這方面的信息,但我沒有找到正確的搜索標記找到任何提及這個評論。

謝謝!

+0

我們需要一個[mcve]來展示如何獲得XML以及它的字符串值是什麼。 – dbc

回答

1

當序列化一個XmlDocument時,Json.NET將無法插入一個硬編碼的comment - 在XmlNodeConverter中根本沒有任何邏輯來做到這一點。唯一的一次XmlNodeConverter會寫一個評論是,如果XmlNodeType.Comment類型的XML節點是在XML DOM層次結構在源代碼中實際遇到,大約行1502

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

因此,只有幾種方法這樣的註釋字符串本來可以添加到您的JSON輸出,包括:

  1. 有可能實際上是在你的XML comments,由Zillow的API或通過自己的應用程序都在其代碼堆棧增加。例如,考慮以下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版本將註釋插入到輸出中。例如,考慮以下全局轉換器:

    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定製版。

樣本fiddle展示了前兩種可能性。

如果你確實有註釋節點在你的XML,你可以按照How to remove all comment tags from 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); 
    }  

樣品fiddle

如果您使用自己的Json.NET自定義構建,則需要調查並解決這種情況發生的原因。

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

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(); 
    }  

樣品fiddle

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

    public override void WriteComment(string text) 
    { 
    } 
} 

如下然後使用它。

+1

這是第1項;註釋是在xml中,但不在json中的同一個位置(至少在我在控制檯窗口中查看xml時)。感謝徹底的答案@dbc,您實際上幫助我解決了有關此描述的另一個問題。 –