【发布时间】: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所示。