尝试使用 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)-> 更改我的方法以返回 ListDataTable
序列化为一个字符串,然后框架在返回时对其进行第二次重新序列化。
至于如何解决您的问题,如果您不想创建数据模型,则直接返回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 SOAP 和 WCF REST 服务托管为 Azure 应用服务