IT

C # 익명 형식을 JSON 문자열로 직렬화하려면 어떻게합니까?

lottoking 2020. 6. 5. 08:12
반응형

C # 익명 형식을 JSON 문자열로 직렬화하려면 어떻게합니까?


익명 유형을 JSON으로 직렬화하기 위해 다음 코드를 사용하려고합니다.

var serializer = new DataContractJsonSerializer(thing.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, thing);
var json = Encoding.Default.GetString(ms.ToArray()); 

그러나 이것이 실행될 때 다음 예외가 발생합니다.

'<> f__AnonymousType1`3 [System.Int32, System.Int32, System.Object []]'유형은 직렬화 할 수 없습니다. DataContractAttribute 특성으로 표시하고 DataMemberAttribute 특성으로 직렬화하려는 모든 멤버를 표시하십시오. 지원되는 다른 유형에 대해서는 Microsoft .NET Framework 설명서를 참조하십시오.

익명 유형에 속성을 적용 할 수 없습니다 (아는 한). 이 직렬화를 수행하는 다른 방법이 있습니까, 아니면 뭔가 빠졌습니까?


DataContractJsonSerializer 대신 JavaScriptSerializer를 사용해보십시오.

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);

다른 사람들이 언급했듯이 Newtonsoft JSON.NET 은 좋은 옵션입니다. 다음은 간단한 JSON 직렬화의 특정 예입니다.

return JsonConvert.SerializeObject(
    new
    {
       DataElement1,
       SomethingElse
    });

나는 그것이 매우 유연하고 다재다능한 라이브러리라는 것을 알았습니다.


내 ServiceStack JsonSerializer 는 현재 가장 빠른 .NET JSON 직렬 변환기 입니다. DataContract, 모든 POCO 유형, 인터페이스, 익명 유형을 포함한 후기 바인딩 된 객체 등의 직렬화를 지원합니다.

기본 예

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = customer.ToJson();
var fromJson = json.FromJson<Customer>(); 

참고 : 다른 JSON 직렬 변환기보다 최대 40x-100x 느리기 때문에 벤치 마크에서 제외해야하므로 성능이 중요하지 않은 경우 Microsoft JavaScriptSerializer 만 사용하십시오 .


오늘은 serializer가 내장되어 있어야하며 swagger + 속성을 사용하여 소비자에게 엔드 포인트 및 반환 데이터를 알리는 데 도움이 될 수 있다고 주장합니다.


익명 유형을 직렬화해서는 안된다고 주장합니다 . 나는 여기서 유혹을 안다. 브라우저의 자바 스크립트와 같이 느슨하게 유형이 지정된 환경에서 사용될 일부 폐기 유형을 빠르게 생성하려고합니다. 여전히 실제 유형을 만들고 Serializable로 장식합니다. 그런 다음 웹 메소드를 강력하게 입력 할 수 있습니다. 이것은 Javascript에 대한 하나의 iota와 관련이 없지만 메소드에 자체 문서를 추가합니다. 합리적으로 숙련 된 프로그래머라면 함수 서명을보고 "아, 이것은 Foo 타입입니다! JSON에서 어떻게 보일지 알고 있습니다."라고 말할 수 있습니다.

그렇게 말하면 JSON.Net 을 사용하여 직렬화를 시도 할 수 있습니다 . 그것이 효과가 있을지 모르겠다


내가 찾은 가장 빠른 방법은 다음과 같습니다.

var obj = new {Id = thing.Id, Name = thing.Name, Age = 30};
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(obj);

네임 스페이스 : System.Web.Script.Serialization.JavaScriptSerializer


웹 서비스에 이것을 사용한다고 가정하면 클래스에 다음 속성을 적용하면됩니다.

[System.Web.Script.Services.ScriptService]

그런 다음 Json을 리턴해야하는 각 메소드에 다음 속성이 있습니다.

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

메소드의 리턴 유형을 "객체"로 설정하십시오.


Newtonsoft.Json을 사용할 수 있습니다.

var errorJSON = JsonConvert.SerializeObject(new {
                errorMessage = "My error to inform you"
            });

public static class JsonSerializer
{
    public static string Serialize<T>(this T data)
    {
        try
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream();
            serializer.WriteObject(stream, data);
            string jsonData = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length);
            stream.Close();
            return jsonData;
        }
        catch
        {
            return "";
        }
    }
    public static T Deserialize<T>(this string jsonData)
    {
        try
        {
            DataContractJsonSerializer slzr = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
            T data = (T)slzr.ReadObject(stream);
            stream.Close();
            return data;
        }
        catch
        {
            return default(T);
        }
    }
}

참고 URL : https://stackoverflow.com/questions/331976/how-do-i-serialize-ac-sharp-anonymous-type-to-a-json-string

반응형