C # 익명 형식을 JSON 문자열로 직렬화하려면 어떻게합니까? ‘<> f__AnonymousType1`3 [System.Int32, System.Int32, System.Object

익명 유형을 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


답변

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

var warningJSON = JsonConvert.SerializeObject(new {
                warningMessage = "You have been warned..."
            });


답변

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

[System.Web.Script.Services.ScriptService]

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

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