programing

뉴턴소프트.이스케이프 백슬래시가 없는 Json Serialize Object

starjava 2023. 3. 13. 20:04
반응형

뉴턴소프트.이스케이프 백슬래시가 없는 Json Serialize Object

코드 지정:

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);

출력은 다음과 같습니다.

"{\"Bar\":\"something\"}"

큰 json 문서를 디버깅할 때 Newtonsoft의 내장 기능을 사용하면 읽기 어렵습니다.Json(물건이 파손될 수 있는 regex 또는 hack이 아님)은 출력을 Valie로 문자열로 만드는 방법이 있습니다.

{Bar: "something"}

WebApi 메서드에서 값을 반환하는 동안 이 문제가 발생하면 개체를 직렬화하고 json 문자열을 반환하는 대신 개체 자체를 반환해 보십시오.WebApi는 기본적으로 응답의 json에 개체를 직렬화합니다. 문자열을 반환하면 발견된 모든 큰 따옴표가 이스케이프됩니다.

그래서 다음 대신:

public string Get()
{
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
    return json;
}

시험:

public ExpandoObject Get()
{
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    return foo;
}

JToken에 접속합니다.해석 방식디버거에서 JSON 오브젝트를 보면 정확하지만 조작하면 리터럴로 변환됩니다(백슬래시가 추가됨).JToken.해석 방식은 이것을 회피하는 것 같습니다.

var token = JToken.Parse(text);

따라서 원래 질문의 경우 다음과 같습니다.

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
var token = JToken.Parse(json);
//Do stuff with token -- not json string

내 경우에는 특히 JObject를 사용하는 것이 문제였다.Add(json)는 내 문자열이 json임을 인식하지 못하고 문자열 전체를 단일 속성으로 삽입합니다.일단 Jtoken으로 변환되면 JSON은 올바르게 해석됩니다.

디버거에서 볼 수 있는 것은jsonvalue는 동일한 값을 얻기 위해 C# 파일에서 사용해야 하는 문자열 값입니다.

정말이지, 당신이 대신할 수 있는 것은

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);

와 함께

string json = "{\"Bar\":\"something\"}";

프로그램 동작을 변경하지 않고.

따라서 다른 값을 얻으려면 JsonConvert 동작 방식을 변경해야 하지만 JsonConvert는 JSON 표준을 준수하므로 무시하십시오.

실제로 ExpandoObject를 시리얼화하지 않는 경우(또한 관리 범위를 벗어난 다른 sealed class도 포함), json에서 시리얼화하는 유형의 DebuggerDisplayAttribute를 사용하여 디버깅 중 오브젝트가 어떻게 표시되는지 정의할 수 있습니다(코드로,fooinstance)를 클릭합니다.

그러나 문자열은 문자열이고 Visual Studio가 맞습니다. 이중 따옴표는 이스케이프해야 합니다.

진부한 질문이지만 이걸 찾았어요

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

콘솔에 JSON을 출력했을 때 이스케이프 문자가 없었습니다.도움이 됐으면 좋겠다.

Newstonsoft를 사용하는 대신.JavaScript Serializer를 사용해야 합니다.시리얼화 방법:

dynamic foo = new ExpandoObject();
foo.Bar = "something";
var js = new JavaScriptSerializer( );
string json = js.Serialize(foo);

이 메서드를 사용하면 원하는 출력이 정확하게 생성됩니다.여기서 읽었어요.

단순합니다. IHttpActionResult를 반환하고 개체를 반환합니다.

  public IHttpActionResult Get()
    {

        ExpandoObject foo = new ExpandoObject();
        foo = //query result

        return ok(foo)
    }

난 그냥 파일에 적기만 하면 돼

 using (System.IO.StreamWriter file = 
            new System.IO.StreamWriter(@"jsonGonna.txt", true))
        {
            file.WriteLine(json);
        }

이제 프로그램을 실행하면 검은색 슬래시 없이 JSON을 여러 번 저장해야 하는 큰 프로그램에 적합합니다.

사실 이건 시리얼라이저와는 아무 관련이 없어요.에에 c# 음 it 、 c# 음 음 、 concept 、 concept 、 concept 、 concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept concept 。Javascipt그래서 큰따옴표로 묶인 문자열은 탈출하지 않고는 표시할 수 없습니다.html/ cshtml탈옥은 없고, 이렇게 코밀러에게 말하면 됩니다.

window.MYVAR = JSON.parse('@Html.Raw(ViewBag.MyStringFromCSharp)');

컨트롤러 뷰 방식에서 데이터를 이러한 형식으로 가져와 JavaScript에서 작업하기 어려운 경우.다음은 간단한 대처법입니다.

const CleanUpDifficultJSonData = difficultJSonData => {
  const dummyElement = document.createElement('div');
  dummyElement.innerHtml = difficultJSonData;
  const cleanJSonData = JSON.parse(dummyElement.innerHtml);
  return cleanJSonData;
};

const difficultJSonData = "{\"Bar\":\"something\"}";

console.log('cleanJSonData: ', 
CleanUpDifficultJSonData(difficultJSonData));      

    [HttpGet]
    public object Get(int id)
    {

        object result = "";
        var db = new dbEntities();
        var EO = new System.Dynamic.ExpandoObject() as IDictionary<string, Object>; //needed to return proper JSON without escape slashes
        try
        {

            IEnumerable<usp_GetComplaint_Result> aRow =  db.usp_GetComplaint(id);

            string DBL_QUOTE = new string(new char[] { '"' });
            result = "{";

            foreach (usp_GetComplaint_Result oneRow in aRow)
            {
                System.Reflection.PropertyInfo[] properties = typeof(usp_GetComplaint_Result).GetProperties();

                foreach(System.Reflection.PropertyInfo property in properties)
                {
                    var vValue = property.GetValue(oneRow) == null ? "null" : property.GetValue(oneRow);
                    EO.Add(property.Name,vValue);
                }
                break;
            }

        }
        catch (Exception ex)
        {
            result = ex.Message;
            EO.Add("Error", result);
        }
        finally
        {
            db.Dispose();
        }

        return Ok(EO);

    }

언급URL : https://stackoverflow.com/questions/20312974/newtonsoft-json-serializeobject-without-escape-backslashes

반응형