1

次のオブジェクトを JSON として返す基本的な Web サービスがあります。

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 クラスを作成することだと思います。

ただし、それを行いたくない場合は、少なくとも 2 つの代替手段があります。

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 に答える