2017-05-02 69 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,您实际上帮助我解决了有关此描述的另一个问题。 –