programing

wcf에서 raw json(문자열)을 반환하는 중

starjava 2023. 3. 23. 22:12
반응형

wcf에서 raw json(문자열)을 반환하는 중

자체 JSON을 구축하여 서비스에서 문자열을 반환하고 싶습니다.다음 코드는 다음과 같습니다.

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
public string GetCurrentCart()
{
    //Code ommited
    string jsonClient = null;
    var j = new { Content = response.Content, Display=response.Display, SubTotal=response.SubTotal};
    var s = new JavaScriptSerializer();
    jsonClient = s.Serialize(j);
    return jsonClient;
}

수신한 응답에는 c# 문자열에 "s"를 작성하기 위해 사용되는 ""가 포함되어 있습니다.

다음은 답변입니다.

"{\"Content\":\"\\r\\n\\u003cdiv\\u003e\\r\\n\\u003cinput type=\\\"hidden\\\" name=\\\"__VIEWSTATE\\\" id=\\\"__VIEWSTATE\\\" value=\\\"\/wEPDwUBMA9kFgJmD2QWAmYPZBYGAgMPFgIeBFRleHQFKFlvdSBoYXZlIG5vIGl0ZW1zIGluIHlvdXIgc2hvcHBpbmcgY2FydC5kAgUPFgIeB1Zpc2libGVoZAIHDxQrAAIPFgIfAWhkZGQYAQUMY3RsMDEkbHZDYXJ0D2dkoWijqBUJaUxmDgFrkGdWUM0mLpgQmTOe8R8hc8bZco4=\\\" \/\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\\r\\n\\u003cdiv class=\\\"block block-shoppingcart\\\"\\u003e\\r\\n    \\u003cdiv class=\\\"title\\\"\\u003e\\r\\n        \\u003cspan\\u003eShopping Cart\\u003c\/span\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"clear\\\"\\u003e\\r\\n    \\u003c\/div\\u003e\\r\\n    \\u003cdiv class=\\\"listbox\\\"\\u003e\\r\\n        You have no items in your shopping cart.\\r\\n        \\r\\n        \\r\\n    \\u003c\/div\\u003e\\r\\n\\u003c\/div\\u003e\\r\\n\",\"Display\":\"You have no items in your shopping cart.\",\"SubTotal\":null}"

값이 올바르게 인코딩되고 있지만 json 자체의 형식이 올바르지 않습니다.이 \가 원인입니다.

"s" 앞에 \"가 없는 문자열을 반환하려면 어떻게 해야 합니까?

현재 웹 메서드는String와 함께ResponseFormat = WebMessageFormat.Json따라서 코드에서는 문자열의 JSON 인코딩이 사용됩니다.json.org에 대응하고 있기 때문에 문자열 내의 모든 이중 따옴표는 백슬래시를 사용하여 이스케이프됩니다.따라서 현재 이중 JSON 인코딩을 사용하고 있습니다.

모든 종류의 데이터를 반환하는 가장 쉬운 방법은 의 출력 유형을 변경하는 것입니다.GetCurrentCart()웹 메서드Stream또는Message(출처:System.ServiceModel.Channels대신 )를 사용합니다.String.

코드 예에 대해서는, 을 참조해 주세요.

어떤 버전의 의 질문에는 포함되어 있지 않기 때문입니다.사용하고 있는 NET에서는, 범용(가장 간단한) 방법을 사용하는 것을 추천합니다.

public Stream GetCurrentCart()
{
    //Code ommitted
    var j = new { Content = response.Content, Display=response.Display,
                  SubTotal=response.SubTotal};
    var s = new JavaScriptSerializer();
    string jsonClient = s.Serialize(j);
    WebOperationContext.Current.OutgoingResponse.ContentType =
        "application/json; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes(jsonClient));
}

Oleg가 제안한 방법을 사용해 보았지만, 대량의 데이터에 대해 이 방법을 사용했을 때 JSON 문자열 끝에 늘키워드가 부가되어 있었습니다.

예: 데이터가 많은 json의 경우 {"JsonExample":xxxxx"}null

http://wcf.codeplex.com/workitem/67 에서 이 문제를 해결하기 위한 솔루션을 찾았습니다.개체를 받아들여 Pure Json 출력을 반환하는 다음 함수를 작성했습니다.그래서 메인 메서드에서 오브젝트를 반환하기 전에 아래 메서드로 호출합니다.

  public HttpResponseMessage ReturnPureJson(object responseModel)
    {
        HttpResponseMessage response = new HttpResponseMessage();

        string jsonClient = Json.Encode(responseModel);
        byte[] resultBytes = Encoding.UTF8.GetBytes(jsonClient);
        response.Content = new StreamContent(new MemoryStream(resultBytes));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

        return response;
    }

라이브러리를 사용하여 JSON 개체 또는 동적(Expando Object)을 직렬화할 것을 권장합니다.

내 경우 항상 "{}"을(를) 받는 것과 같은 null 값 문제를 피할 수 있습니다.JsonConvert.SerializeXXX{aa:bb}을(를) {key:aa, value:bb}로 확장합니다.JavaScriptSerializer

여기 전체 샘플은 아래와 같습니다.

인터페이스:

[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "json/GetCurrentCart")]
Stream GetCurrentCart(MyRequestParam Param);

구현:

public Stream GetCurrentCart(MyRequestParam Param)
{
    //code omitted
    dynamic j = new System.Dynamic.ExpandoObject();
    j.Content = response.Content;
    j.Display = response.Display; 
    j.SubTotal = response.SubTotal;
    string s = Jil.JSON.SerializeDynamic(j);
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
    return new MemoryStream(Encoding.UTF8.GetBytes(s));
} 

훌륭했습니다(Oleg Response).모두 WebOperationContext 행을 추가해야 합니다.현재의.Outgoing Response.ContentType = "application/json; charset=utf-8";

삭제 시 결과는 file로 다운로드 됩니다.

언급URL : https://stackoverflow.com/questions/3078397/returning-raw-json-string-in-wcf

반응형