C# 尝试使用JSON.net和WCF Rest服务将XML转换为JSON输出时出现反斜杠问题
我已经花了两天时间试图找到解决问题的方法,但没有结果,所以我希望得到任何提示 我正在努力实现的目标:C# 尝试使用JSON.net和WCF Rest服务将XML转换为JSON输出时出现反斜杠问题,c#,json,xml,wcf,C#,Json,Xml,Wcf,我已经花了两天时间试图找到解决问题的方法,但没有结果,所以我希望得到任何提示 我正在努力实现的目标: 简单地说,我创建并发布了一个WCF服务(RESTfulWeb服务),其中一个方法GetUsers应该返回如下内容: [{"Name":"John","Surname":"Dell","GroupName":"Operator"}, {"Name":"
简单地说,我创建并发布了一个WCF服务(RESTfulWeb服务),其中一个方法GetUsers应该返回如下内容:
[{"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格式的初始数据,将其传递给datatable对象,然后尝试使用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>
正如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并返回给客户端
WCF已经将返回的值序列化为JSON(如果响应类型与您的情况一样设置为JSON),您不需要JSON NET。这里发生的是将对象序列化并返回一个字符串,然后WCF将该字符串再次序列化为JSON。结果是,您返回的不是JSON对象,而是单个字符串(它也是有效的json,但不是您想要的)。因此,直接从您的方法返回一个对象,而不进行序列化。让我看看我的理解是否正确。我是否应该创建一个类“Employees”(将名称、姓氏和组名作为DataMember)->将我的方法更改为return List,在方法本身中,我应该将XML结果转换为List类型的对象并返回该对象?是的,这将是最好的操作过程。您可以尝试返回ds.Tables[0],但出于许多原因,我最好使用专用类。这基本上似乎是一个重复的-,您将
数据表
序列化为字符串,然后在返回时由框架第二次重新序列化。至于如何解决您的问题,如果您不想创建数据模型,有一个选项可以返回数据直接使用表
只需通过WebOperationContext.Current.CreateTextResponse返回已经序列化的JSON,如和所示。
public class Service : IService
{
public Person GetUsers()
{
Person person = new Person();
person.Name = "wwww";
person.Surname = "Dell";
person.GroupName = "Operator";
return person;
}
}