[C#] C #으로 JSON 직렬화 해제

Facebook 친구의 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 출력을 복사하여 여기에 넣는 것입니다.

http://json2csharp.com/

직렬화 해제를 위해 클래스를 수정하기위한 시작점을 제공합니다.


답변

Dictionary와 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루프를 사용하여 각 반복에서 데이터를 가져올 수 있습니다 .

또한 무언가를 추가하고 싶습니다.

for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
    var data = jsonData[i - 1];
}

동적 객체로 작업하고 Newtonsoft 직렬화를 사용하는 것이 좋습니다.


답변

나는 Icarus에 동의하지만 (가능한 경우 주석을 달았을 것임) CustomObject 클래스 를 사용하는 대신 Dictionary를 사용합니다 (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);