programing

익명 객체에 JSON 직렬화 해제

procenter 2023. 2. 11. 17:19
반응형

익명 객체에 JSON 직렬화 해제

C#에서는, 이러한 코드를 사용해 익명의 오브젝트를 JSON에 시리얼 하는데 성공했습니다.

var obj = new { Amount = 108, Message = "Hello" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);

다만, 나중에 할 수 있는 것은, JSON 문자열을 어나니머스 오브젝트로 역직렬화하는 것입니다.이런 거...

var obj2 = serializer.Deserialize(output, object);

하지만 연재기는요deserialize() 메서드를 사용하려면 역직렬화하는 오브젝트 유형인 두 번째 파라미터가 필요합니다.

이거 해봤는데...

var obj2 = serializer.Deserialize(output, obj.GetType());

그러나 이로 인해 다음과 같은 오류가 발생합니다.

<>f__Anonymous 유형에 대해 정의된 매개 변수 없는 생성자가 없습니다.Type 0'2 [ System 。Int32, mscorlib, 버전=4.0.0, Culture=중립, 공개키토큰=b77a5c561934e089],[시스템]문자열, mscorlib, 버전=4.0.0, Culture=중립, 공개키토큰=b77a5c561934e089]'

나는 이 오류가 무슨 뜻인지 모르겠다.

다이내믹스는 어떨까요?제가 보기에는 가장 빠른 방법은 다음과 같습니다.

dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;

주의: Newtonsoft.json.dll 참조가 필요합니다.

JSON.Net은 에서 JSON과 함께 사용할 수 있는 강력한 라이브러리입니다.그물

역직렬화 방법이 있습니다.익명 할 수 있는 타입.

업데이트: Json.ASP에 Net이 추가되었습니다.넷, 하지만 최근에 가장 좋아하는 것은 JsonFX입니다.linq 지원도 훌륭합니다. 확인해 보세요.

업데이트 2: JsonFX에서 이전하여 현재 ServiceStack을 사용하고 있습니다.문자, 빨라!

DiserializeObject 메서드를 사용하면 특정 유형이 필요하지 않습니다.이것은 또한 유사한 SO 문제를 해결했다.이 메서드는 A로 역직렬화됩니다.Dictionary<string, object>이름/값 쌍을 포함합니다.

업데이트: 이 작업을 수행할 때 발생하는 오류를 명확히 하기 위해:

var obj2 = serializer.Deserialize(output, obj.GetType());

의 종류에 따라obj,Deserialize는 기본 생성자를 사용하여 유형의 새 인스턴스를 생성하려고 합니다.C#의 어나니머스 타입에는 퍼블릭파라미터리스 컨스트럭터가 없기 때문에 조작은 실패합니다.

이는 다음과 같이 내장된 JavaScript Serializer를 사용하여 수행할 수도 있습니다.

object result = new JavaScriptSerializer().DeserializeObject(JSONData);

키와 값의 쌍을 가진 개체 [] 인스턴스가 반환됩니다.

최근에는 멋진 JsonFx를 사용하고 있습니다.Net Library와 저는 그 기능을 높이 평가하게 되었습니다.Nuget Package Manager를 사용하여 Visual Studio 내에 직접 설치할 수 있습니다.

코드는 이렇습니다.

var reader = new JsonReader();
string input = @"{ ""first"": ""Foo"", ""last"": ""Bar"" }";
var template = new { first=String.Empty, middle=String.Empty, last=String.Empty };
var output = reader.Read(input, template);

보시다시피 익명 유형에 대한 템플리트도 지정할 수 있습니다.

뉴턴소프트를 사용한다면.역직렬화를 시도해 볼 수 있습니다.익명유형법

    var obj1 = new { Amount = 108, Message = "Hello" };
    var json=JsonConvert.SerializeObject(obj1);

    // or as well
    var json= "{ \"Amount\" : 108, \"Message\" : \"Hello\" }";
   
   //Deserialization

   var definition = new { Amount = 0, Message = "" };

    //obj2 type is "anonymous"
   var obj2 = JsonConvert.DeserializeAnonymousType(json,definition); 

결과

{ Amount = 108, Message = "Hello" }

수동으로 입력하지 않을 경우 가장 쉬운 방법은 다음과 같습니다.

var jsonString = JsonHelper.SerializeObject(item);
ExpandoObject obj = JsonHelper.DeserializeObject<ExpandoObject>(jsonString);

대신 JObject를 사용하여 JSON 문자열을 역직렬화할 수 있습니다.

using Newtonsoft.Json.Linq;

string output = "{\"Amount\" = 108, \"Message\" = \"Hello\"}";
var amount = JObject.Parse(output)["Amount"];

언급URL : https://stackoverflow.com/questions/6904825/deserialize-json-to-anonymous-object

반응형