尝试使用 json.net 和 WCF Rest Service 将 XML 转换为 JSON 输出时出现反斜杠问题

Posted

技术标签:

【中文标题】尝试使用 json.net 和 WCF Rest Service 将 XML 转换为 JSON 输出时出现反斜杠问题【英文标题】:Backslash issue when trying to convert XML to JSON output using json.net and WCF Rest Service 【发布时间】:2021-02-12 06:44:55 【问题描述】:

我已经花了两天时间试图找到解决我的问题的方法,但没有任何结果,所以我会很感激任何提示。

我想要达到的目标: 简而言之,我使用一种方法 GetUsers 创建并发布了 WCF 服务(RESTful Web 服务),该方法应返回如下内容:

["Name":"John","Surname":"Dell","GroupName":"Operator", "Name":"John1","Surname":"Hp","GroupName":"Operator", "Name":"John2","Surname":"Apple","GroupName":"Operator"] 

不幸的是,当我在浏览器中测试此方法时(http://localhost:28099/TestAPI.svc/GetUsers?inputName=Company,我得到的响应包括转义反斜杠和开头和处的双引号结果的结尾,如下所示:

 "[\"Name\":\"John\",\"Surname\":\"Dell\",\"GroupName\":\"Operator\", \"Name\":\"John1\",\"Surname\":\"Hp\",\"GroupName\":\"Operator\", \"Name\":\"John2\",\"Surname\":\"Apple\",\"GroupName\":\"Operator\"]" 

使用此 Web 服务的应用程序告诉我这不是有效的 JSON 格式。 在我的 Web 服务方法中,我获取 XML 格式的初始数据,将其传递给数据表对象,然后尝试使用 JSON.NET 将其转换为 JSON。 以下是源 XML:

   <Root>
    <row Name ="John" Surname="Dell" GroupName="Operator"/>
    <row Name ="John1" Surname="Hp" GroupName="Operator"/>
    <row Name ="John1" Surname="Apple" GroupName="Operator"/>
    </Root>

下面是我的 WCF 代码中的一个 sn-p:

    [ServiceContract]
        public interface IWebServiceTest
        
            
            [OperationContract]
            [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
            String GetUsers(string inputName);

    public class TestWCF: IWebServiceTest

 Public String GetUsers(string inputName)

...................
StringReader stringReader1 = new StringReader(responseXMLResult.ToString());
XmlReader reader = XmlReader.Create(stringReader1);
ds.ReadXml(reader);
string json = JsonConvert.SerializeObject(ds.Tables[0], Newtonsoft.Json.Formatting.None);
return json

【问题讨论】:

WCF 已经将您返回的值序列化为 JSON(如果响应类型设置为 Json,如您的情况),您不需要 JSON NET。这里发生的是您序列化您的对象并返回一个字符串,然后 WCF 再次将此字符串序列化为 JSON。结果,您返回的不是 JSON 对象,而是单个字符串(它也是有效的 json,但不是您想要的)。因此,从您的方法中直接返回一个对象,无需序列化。 让我看看我的理解是否正确。我是否应该创建一个类“Employees”(姓名、姓氏和 GroupName 作为 DataMember)-> 更改我的方法以返回 List 并且在方法本身中我应该将 XML 结果转换为 List 类型的对象并返回对象? 是的,这将是最好的做法。您可以尝试返回 ds.Tables[0],但出于多种原因,我最好使用专门的课程。 这基本上似乎是JSON.NET Parser seems to be double serializing my objects 的副本——您将DataTable 序列化为一个字符串,然后框架在返回时对其进行第二次重新序列化。 至于如何解决您的问题,如果您不想创建数据模型,则直接返回DataTable 的一种选择是通过@987654330 简单地返回已经序列化的JSON @如How to return a Dictionary of custom type values as a regular JSON object from a WCF REST method?和How to set Json.Net as the default serializer for WCF REST service所示。 【参考方案1】:

正如 Evk 所说,WCF 已将您返回的值序列化为 JSON,我们不再需要使用 JSON NET。在 WCF 中,我们使用 DataContract 来序列化对象。这是一个演示:

   [ServiceContract]
    public interface IService

    
        [OperationContract]
        [WebGet(ResponseFormat =WebMessageFormat.Json,BodyStyle =WebMessageBodyStyle.Bare)]
       Person GetUsers();
    

这是服务接口,我们将ResponseFormat设置为json。

[DataContract]

public class Person


    [DataMember]

  public   string Name  get; set; 

    [DataMember]

   public  string Surname  get; set; 

    [DataMember]

   public  string GroupName  get; set; 


这是我们要传输的Person对象,我们使用DataContract来序列化该对象。

public class Service : IService



    public Person GetUsers()

    

        Person person = new Person();

        person.Name = "wwww";

        person.Surname = "Dell";

        person.GroupName = "Operator";

        return person;
    


这是方法的实现类,我们直接返回person对象,WCF会帮我们把这个对象序列化成json返回给客户端。

【讨论】:

以上是关于尝试使用 json.net 和 WCF Rest Service 将 XML 转换为 JSON 输出时出现反斜杠问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Json.Net 设置为 WCF REST 服务的默认序列化程序

Wcf 服务器和实体框架问题

尝试发布到 wcf rest 4 服务时出现错误请求

将 WCF SOAP 和 WCF REST 服务托管为 Azure 应用服务

使用 AngularJs 调用 WCF REST 服务给出错误

尝试 GET 时出现 WCF REST 404