programing

Json을 반환하지만 원하지 않는 뒤로 슬래시 "\"를 포함합니다.

javajsp 2023. 2. 23. 22:02

Json을 반환하지만 원하지 않는 뒤로 슬래시 "\"를 포함합니다.

MVC4 web-api, c#을 사용하고 있으며, Json.net을 사용하여 Json을 반환하고 싶습니다.

문제는 "뒤로 가는 슬래시"가 있다는 것입니다.

Global.asax에도 이 코드를 추가했습니다.글로벌 설정배열.포메터XmlFormatter.지원되는 Media Types.클리어();

반환되는 내용은 다음과 같습니다.

"{\"cid\":1,\"model\":\"WT50JB\",\"detail\":\"sdf??\",\"unit\":2,\"time_in\":\"2012-12-11T19:00:00\",\"time_out\":\"2012-12-12T13:00:06.2774691+07:00\",\"time_used_dd\":0.0,\"time_used_hh\":0.0}"

이 경우 {"cid":1", model":WT50JB" "detail" "sdf?" "unit":2 "time_in":2012-12-11T 19:00:00" "time_out":2012-12T 13:08:50.5444555+07:00" "time_used_h:0"

여기는 JsonConvertor

string json = JsonConvert.SerializeObject(myObj);

저도 얼마 전까지만 해도 같은 문제가 있었어요.알고 보니 JSON 문자열을 "이중 직렬화"하고 있었습니다. jQuery를 합니다.$.getJson(JsonResultC Generic을 빌드하기 때문에 C# Generic은 C# Generic을 빌드합니다.List<t> C# Generic JSON.net/NewtonSoft을 JSON.net/했습니다.List<t>다음 명령을 사용하여 JSON을 반환하기 전에 JSON 개체로 이동합니다.

return Json(fake, JsonRequestBehavior.AllowGet);

될 것 같아요.JsonConvert.SerializeObject(이 방법, 이 방법, 이 방법return시리얼라이제이션이 변환됩니다.

당신이나 다른 사람에게도 도움이 되길 바랍니다.

나는 여기서 해결책을 찾았다.

return new HttpResponseMessage() 
{
    Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};
using Newtonsoft.Json.Linq;
string str = "Your String with Back Slashes";
str = JToken.Parse(str).ToString(); `// Now You will get the Normal String with "NO SLASHES"`

대부분의 경우 슬래시는 VisualStudio 디버거에서 복사했기 때문에 아티팩트입니다.디버거는 모든 문자열을 C/C# 코드에 붙여넣을 수 있는 방식으로 표시합니다.전송된 데이터에는 실제로 존재하지 않습니다.

BTW: 이 슬라시는 로 슬라시입니다.슬래시는 다음과 같습니다. /

「완전한」코드의 스니펫을 표시하기 위해서, 다음과 같이 솔루션을 실현했습니다.

    [AllowAnonymous]
    [HttpGet]
    public HttpResponseMessage GetAllMessages()
    {

        try
        {
            //Load Data Into List
            var mm = new MessageManager();
            List<Message> msgs = mm.GetAllMessages();

            //Convert List Into JSON
            var jsonmsgs = JsonConvert.SerializeObject(msgs);

            //Create a HTTP response - Set to OK
            var res = Request.CreateResponse(HttpStatusCode.OK);

            //Set the content of the response to be JSON Format
            res.Content = new StringContent(jsonmsgs, System.Text.Encoding.UTF8, "application/json");

            //Return the Response
            return res;
        }
        catch (Exception exc)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc);
        }
    }

대부분 이중 직렬화로 인해 발생합니다.이전에도 Json 문자열로 컬렉션을 시리얼화해야 하는 문제가 있었습니다.다양한 회피책을 시도해도 해결할 수 없었습니다.따라서 최종적으로 모든 시리얼화 코드를 삭제하고 컬렉션 오브젝트를 반환하기만 하면 시리얼화는 디폴트로 처리됩니다.따라서 시리얼화 코드를 삭제하고 반환 유형만 반환해 보십시오.비슷한 문제를 안고 있는 사람에게 도움이 되길 바랍니다.

몇 시간 동안 이것을 알아내려고 노력한 후, 이 질문에 대한 하나의 인기 있는 답변이 나에게 딱 맞는 것 같았다.하지만 내가 상상했던 방식은 아니야.

제 코드는 매우 단순했습니다.

this.Request.CreateResponse(HttpStatusCode.Accepted, new JavaScriptSerializer().Serialize(obj));

'이중 연재'라는 통속적인 반응은 나에게 적용되지 않는다고 확신했다.JSON에 오브젝트를 명시적으로 시리얼화한 것은 한 번뿐입니다.

이 토막을 써봤습니다.

new StringContent(json, System.Text.Encoding.UTF8, "application/json")

내 데이터도 없는 것 같았어!대신 제가 받은 것은 다음과 같습니다.

{
  "Headers": [
    {
      "Key": "Content-Type",
      "Value": [
        "application/json; charset=utf-8"
      ]
    }
  ]
}

음... 하지만 봐봐!Swagger UI에서 원래 응답을 자세히 보고 복사하여 JSON 미녀에 붙여넣은 후, 사실 저는 "더블 연재"를 하고 있었습니다.다음 코드를 사용하면 올바른 JSON 응답을 얻을있습니다.

 this.Request.CreateResponse(HttpStatusCode.Accepted, obj);

그렇습니다! 직렬화 가능한 개체를 직접 전송하기만 하면 됩니다. JSON에 직렬화할 필요가 없습니다! 응답은 개체를 JSON에 자동으로 직렬화시키는 것 같습니다.이게 도움이 됐으면 좋겠네요!

편집: 예를 들어 데이터베이스에서와 같이 JSON 문자열로 시작하는 경우 다음과 같이 문자열을 개체로 역직렬화하고 해당 개체를 반환할 수 있습니다.

object obj = new JavaScriptSerializer().DeserializeObject(json);
this.Request.CreateResponse(HttpStatusCode.Accepted, obj);

같은 문제가 발생했는데 응답에 "사용 시"가 포함되어 있습니다.

        JObject res = processRequst(req);
        String szResponse = res.ToString(Formatting.None);
        return Request.CreateResponse<string>(HttpStatusCode.OK, szResponse);

이 백슬래시는 위의 코드를 다음과 같이 치환하면 삭제됩니다.

        JObject res = processRequst(req);
        return Request.CreateResponse<JObject>(HttpStatusCode.OK, res);

나는 그 대답의 조합이 나에게 효과가 있다는 것을 알았다.위에서 언급한 대로 이중 연재를 하고 있었어요.시리얼라이제이션에서 JsonProperty 속성을 인식하려면 JsonConvert 시리얼라이저를 사용해야 합니다.예를 들어 RealtTarget이라는 속성이 있는데 실제 타겟으로 시리얼화하려면 이 속성이 필요합니다.Json 결과는 시리얼화 시 JsonProperty를 인식하지 못하기 때문에 JsonConvert를 사용하여 시리얼화했고 다음과 같은 문자열을 반환했습니다.

return Content(JsonConvert.SerializeObject(myData));

솔루션을 찾았고, 나에게도 효과가 있었습니다.

var json = JsonConvert.SerializeObject(sb.ToString(), Formatting.Indented);
response.Content = new StringContent(json, Encoding.UTF8 , "application/json");

이건 나한테 효과가 있었어.Riseres 사용자가 위에 응답했습니다.

return new HttpResponseMessage() 
{
Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json")
};

이 경우 백플래시를 포함한 서버로부터의 문자열은 다음과 같습니다.

{\"cid\":1,\"model\":\"WT50JB\",\"detail\":\"sdf??\",\"unit\":2,\"time_in\":\"2012-12-11T19:00:00\",\"time_out\":\"2012-12-12T13:00:06.2774691+07:00\",\"time_used_dd\":0.0,\"time_used_hh\":0.0}"

API가 POSTMAN을 사용하여 응답 값을 가져오면 백플래시가 계속 나타납니다.Push Back to Client(POSTMAN)를 실행하기 전에 서버에서 문자열을 포맷해야 합니다.MS Web 사이트에는, 「OK」(JSON_string)를 반환하는 방법이 기재되어 있습니다.

마이크로소프트의 안내에 따라 문제를 해결합니다.

public ActionResult Get (int id, int id1)
{
     JSON_string = "your backsplash string"
     return Ok(JSON_string); //it will automatically format in JSON (like eliminate backsplash)

}

https://learn.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-3.1

여기서 해결책을 찾았습니다.

                    response = response.replace("\"", "\\").replace("\\\\", "\"").replace("\\", "");
                JSONArray PackageData = new JSONArray(response);
                SelectSymbolList.clear();
                for (int i = 0; i < PackageData.length(); i++) {
                    JSONObject jsonData = PackageData.getJSONObject(i);
                    // get your array here
                }

내 경우 디버거에서 JSON 문자열을 보고 있었는데 탈출이 추가되어 있는 것을 발견했습니다.콘솔에 JSON을 출력했을 때 이스케이프 문자가 없었습니다.

var jsonContent = JsonConvert.SerializeObject(obj); 
Console.WriteLine("HERE NO SLASHES"+ jsonContent); 

오리지널 : https://stackoverflow.com/a/46836331/4654957

데이터 테이블을 json으로 변환하는 동안 .netcore 프로젝트에서 아래 코드를 사용하여 작동했습니다.

var lst = dt.AsEnumerable()
.Select(r => r.Table.Columns.Cast<DataColumn>()
        .Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal])
       ).ToDictionary(z => z.Key, z => z.Value)
).ToList();

범용 핸들러에서는 이것이 도움이 되었습니다.지정된 문자열이 json이면 try로 반환됩니다.그렇지 않으면 catch로 반환됩니다.

private static dynamic TryParseJSON(string message)
    {
        try
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Deserialize<dynamic>(message);
        }
        catch
        {
            return message;
        }
    }

Andrew Birks가 제안한 답변은 나에게 효과적이다.

//Convert List Into JSON
var jsonString = JsonConvert.SerializeObject(dataTable);

//Create a HTTP response - Set to OK
var response = Request.CreateResponse(HttpStatusCode.OK);

//Set the content of the response to be JSON Format
response.Content = new StringContent(jsonString, System.Text.Encoding.UTF8, "application/json");

//Return the Response
return response;
string jsonString = JsonConvert.SerializeObject(jsonMQTTPayLoad);

"{"이름": "존", "성", "도", "연령": 199 },

 var stringwithoutbackslash = JObject.Parse(jsonString);

{ "이름" : "존", "성" : "도", "연령" : 199 }

솔루션을 찾아 나를 위해 일했습니다(Y)

var yourString = yourString.Replace("\\","");

여기서부턴 내가 맡을게

언급URL : https://stackoverflow.com/questions/13833900/return-json-but-it-includes-backward-slashes-which-i-dont-want