繁体   English   中英

C#WCF Rest Service-嵌套JSON(无转义)

[英]C# WCF Rest Service - Nested JSON (without escaping)

我有一个基本的Web服务,它将以下对象作为JSON返回:

public class GetCustomerResponse
{
  public Guid InteractionId { get; set; }
  public string CustomerInfo { get; set; }
}

CustomerInfo成员也是JSON,所以返回给调用者的内容包含转义的JSON,说实话这是很公平的,也是可以预期的

但是,我希望CustomerInfo JSON被“嵌入”到响应中而没有任何转义。 有人知道这是否可行吗?

之所以必须将CustomerInfo作为字符串来处理,是因为它是由不基于对象的子系统生成的,因此我得到的只是一个原始JSON字符串。

我意识到可以通过在服务中创建CustomerInfo类来解决此问题,但是我宁愿避免这种情况,因为这将是一个包含许多成员的大型类,更重要的是,如果进行了任何更改,则需要更新该服务。

编辑:我已经接受了谢尔盖·库德里亚夫采夫(Sergey Kudriavtsev)的回答,但是,最终我选择了其他解决方案。

我已将json.net库添加到解决方案中,并按如下所示编辑了我的GetCustomer类:

public Newtonsoft.Json.Linq.JObject CustomerInfo { get; set; }

然后在代码中,我从以下位置更改了服务接口:

GetCustomerResponse GetCustomer(int customerId)

至:

void GetCustomer(int customerId)

然后在接口的实现中,我正在执行以下操作

public void GetCustomer(int customerId)
{
  var customerJson = ... code to get json string ...

  var response = new GetCustomerResponse()
  {
    InteractionId = Guid.NewGuid(),
    CustomerInfo = JObject.Parse(customerJson)
  };

  string json = JsonConvert.SerializeObject(response, Formatting.Indented);

  HttpContext.Current.Response.ContentType = "application/json; charset=utf-8";
  HttpContext.Current.Response.Write(json);
}

我认为最正确的方法是创建您所描述的单独的CustomerInfo类。

但是,如果您不想这样做,那么至少有两种选择:

1)手动将您的对象序列化为JSON,即使用类似

public string SerializeGetCustomer(GetCustomer data)
{
    return "{\"InteractionId\":\"" + data.InteractionId.ToString() + 
        "\",\"CustomerInfo\":" + data.CustomerInfo + "}";
}

2)将CustomerInfo反序列化为通用的Dictionary<String, Object> (不创建特定类),然后将其序列化为GetCustomer类的一部分,即:

public class GetCustomer
{
  public Guid InteractionId { get; set; }
  public Dictionary<String, Object> CustomerInfo { get; set; }
  public GetCustomer(Guid interactionId, string customerInfo)
  {
    InteractionId = interactionId;
    CustomerInfo = new JavaScriptSerializer().Deserialize<Dictionary<String,Object>>(customerInfo);
  }
}

...
string result = new JavaScriptSerializer.Serialize(new GetCustomer(interactionId, customerInfo));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM