[英]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.