【问题标题】:Backslash issue when trying to convert XML to JSON output using json.net and WCF Rest Service尝试使用 json.net 和 WCF Rest Service 将 XML 转换为 JSON 输出时出现反斜杠问题
【发布时间】: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所示。

标签: c# json xml wcf


【解决方案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返回给客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多