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);
}
}
}
'IT' 카테고리의 다른 글
스타일 시트로 해석되었지만 MIME 유형 text / html로 전송 된 자원 (웹 서버와 관련이없는 것으로 간주 됨) (0) | 2020.06.05 |
---|---|
데이터베이스에서 레코드를 버전 관리하는 방법 (0) | 2020.06.05 |
iPad Safari 스크롤로 인해 HTML 요소가 사라지고 지연되어 다시 나타납니다. (0) | 2020.06.05 |
람다 식에서 ref 또는 out 매개 변수를 사용할 수 없습니다 (0) | 2020.06.05 |
파일을 수정 한 최신 git commit을 어떻게 찾을 수 있습니까? (0) | 2020.06.05 |