1

我有一个基本的 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);
}
4

1 回答 1

1

我认为最正确的方法是按照您的描述创建一个单独的 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));
于 2012-06-18T11:50:38.170 回答