C#과 JSON의 시리얼화 해제
페이스북 친구의 Graph API 호출을 오브젝트 목록으로 역직렬화하려고 합니다.JSON 오브젝트는 다음과 같습니다.
{"data":[{"id":"518523721","name":"ftyft"},
{"id":"527032438","name":"ftyftyf"},
{"id":"527572047","name":"ftgft"},
{"id":"531141884","name":"ftftft"},
{"id":"532652067","name"...
List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result);
원시적인 물체가 잘못되었기 때문에 효과가 없습니다.이걸 어떻게 역직렬화하면 되죠?
다음과 같은 구조를 작성해야 합니다.
public class Friends
{
public List<FacebookFriend> data {get; set;}
}
public class FacebookFriend
{
public string id {get; set;}
public string name {get; set;}
}
그러면 다음 작업을 수행할 수 있습니다.
Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);
내 수업의 이름은 단지 예시일 뿐이다.당신은 적절한 이름을 사용해야 합니다.
샘플 테스트 추가:
string json =
@"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}";
Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json);
foreach(var item in facebookFriends.data)
{
Console.WriteLine("id: {0}, name: {1}", item.id, item.name);
}
작성:
id: 518523721, name: ftyft
id: 527032438, name: ftyftyf
id: 527572047, name: ftgft
id: 531141884, name: ftftft
동적 객체를 선호할 수 있습니다.
public JsonResult GetJson()
{
string res;
WebClient client = new WebClient();
// Download string
string value = client.DownloadString("https://api.instagram.com/v1/users/000000000/media/recent/?client_id=clientId");
// Write values
res = value;
dynamic dyn = JsonConvert.DeserializeObject(res);
var lstInstagramObjects = new List<InstagramModel>();
foreach(var obj in dyn.data)
{
lstInstagramObjects.Add(new InstagramModel()
{
Link = (obj.link != null) ? obj.link.ToString() : "",
VideoUrl = (obj.videos != null) ? obj.videos.standard_resolution.url.ToString() : "",
CommentsCount = int.Parse(obj.comments.count.ToString()),
LikesCount = int.Parse(obj.likes.count.ToString()),
CreatedTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((double.Parse(obj.created_time.ToString()))),
ImageUrl = (obj.images != null) ? obj.images.standard_resolution.url.ToString() : "",
User = new InstagramModel.UserAccount()
{
username = obj.user.username,
website = obj.user.website,
profile_picture = obj.user.profile_picture,
full_name = obj.user.full_name,
bio = obj.user.bio,
id = obj.user.id
}
});
}
return Json(lstInstagramObjects, JsonRequestBehavior.AllowGet);
}
이러한 클래스를 자동으로 생성하는 가장 좋은 방법은 JSON 출력을 복사하여 여기에 넣는 것입니다.
그것은 당신에게 탈직렬화를 위해 당신의 수업을 손질할 수 있는 출발점을 제공할 것입니다.
사전과 JavaScriptSerializer를 사용하여 JSON 콘텐츠를 쉽게 해석할 수 있습니다.다음은 ashx 파일에서 JSON 콘텐츠를 해석하기 위한 샘플 코드입니다.
var jss = new JavaScriptSerializer();
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json);
string _Name = sData["Name"].ToString();
string _Subject = sData["Subject"].ToString();
string _Email = sData["Email"].ToString();
string _Details = sData["Details"].ToString();
Newtonsoft.JSON
이런 상황에 대한 좋은 해결책입니다.또한.Newtonsof.JSON
다른 것보다 빠르다.예를 들어 다음과 같습니다.JavaScriptSerializer
,DataContractJsonSerializer
.
이 예에서는 다음 작업을 수행할 수 있습니다.
var jsonData = JObject.Parse("your JSON data here");
다음으로 jsonData를 캐스트할 수 있습니다.JArray
, 를 사용할 수 있습니다.for
각 반복 시 데이터를 가져오려면 loop을 클릭합니다.
그리고 덧붙이고 싶은 것이 있습니다.
for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
var data = jsonData[i - 1];
}
동적 객체를 사용하여 Newtonsoft 시리얼라이즈를 사용하는 것이 좋습니다.
Icarus의 의견에 동의하지만(가능하다면 코멘트를 달았을 텐데) CustomObject 클래스를 사용하는 대신 사전(Facebook이 무언가를 추가하는 경우)을 사용하고 싶습니다.
private class MyFacebookClass
{
public IList<IDictionary<string, string>> data { get; set; }
}
또는
private class MyFacebookClass
{
public IList<IDictionary<string, object>> data { get; set; }
}
시리얼화:
// Convert an object to JSON string format
string jsonData = JsonConvert.SerializeObject(obj);
Response.Write(jsonData);
역직렬화:
동적 개체를 역직렬화하려면
string json = @"{
'Name': 'name',
'Description': 'des'
}";
var res = JsonConvert.DeserializeObject< dynamic>(json);
Response.Write(res.Name);
를 사용하고 있는 경우.NET Core 3.0, System을 사용할 수 있습니다.Text.Json(현재 내장)을 사용하여 JSON을 역직렬화합니다.
첫 번째 단계는 JSON을 모델링하는 클래스를 만드는 것입니다.이 문제를 해결할 수 있는 툴이 많이 있으며, 여기에 있는 답변 중 몇 가지가 나와 있습니다.
일부 옵션은 http://json2csharp.com, http://app.quicktype.io 또는 Visual Studio를 사용합니다(편집 → 특수 붙여넣기 → JSON을 클래스로 붙여넣기).
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
}
public class Response
{
public List<Person> Data { get; set; }
}
다음으로, 다음을 사용해 역직렬화할 수 있습니다.
var people = JsonSerializer.Deserialize<Response>(json);
다음과 같은 설정을 추가해야 하는 경우camelCase
처리 후 시리얼라이저 설정을 다음과 같이 디시리얼라이저에 전달합니다.
var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
var person = JsonSerializer.Deserialize<Response>(json, options);
이 확장자를 사용할 수 있습니다.
public static class JsonExtensions
{
public static T ToObject<T>(this string jsonText)
{
return JsonConvert.DeserializeObject<T>(jsonText);
}
public static string ToJson<T>(this T obj)
{
return JsonConvert.SerializeObject(obj);
}
}
올바른 형식의 JSON 문자열을 사용할 수 있는 한 필요한 모든 코드를 지원하는 다른 사이트를 다음에 나타냅니다.
언급URL : https://stackoverflow.com/questions/7895105/deserialize-json-with-c-sharp
'programing' 카테고리의 다른 글
AngularJS $http-post - 이진 파일을 Excel 파일로 변환하여 다운로드 (0) | 2023.04.01 |
---|---|
'1985-02-07' 변환 방법T00:00:00.000Z" (ISO8601)를 Oracle 날짜 값으로 변경하시겠습니까? (0) | 2023.04.01 |
ng-click을 사용하여 루트를 호출하는 방법 및 시기 (0) | 2023.03.27 |
Oracle의 기능과 프로시저 비교 (0) | 2023.03.27 |
워드프레스에 Ajax를 사용하여 JSON 데이터 반환 (0) | 2023.03.27 |