C #으로 JSON 직렬화 해제


206

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);

기본 객체가 유효하지 않기 때문에 작동하지 않습니다. 직렬화를 해제하려면 어떻게해야합니까?


3
이러한 json을 수용하기 위해 특별히 사용자 정의 deserializer를 작성 ...
ashutosh raina

2
또는 당신은 Dictionary<string,string>체크 아웃을 사용할 수 있습니다 : stackoverflow.com/questions/7699972/…
Kakashi

9
친구 : json2csharp.com
nawfal

4
(설치된 웹 도구 2013 년 또는 2012 년)이 정확한 기능이 내장되어 실제로 비주얼 스튜디오 : 편집> JSON으로 수업을 붙여 넣기> 붙여 넣기
floomby

답변:


264

다음과 같은 구조를 만들어야합니다.

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

3
그래, 내가하고 싶지 않은 것은 아이를 담을 새 물건을 만듭니다. 나는 Im이 원시 객체를 꺼내는 json을 부분 문자열로 묶을 것이라고 생각합니다. 감사합니다.

@Kevin Holditch 수정 해 주셔서 감사합니다. 나는 하나의 중요한 비트를 놓쳤다 :)
Icarus

2
이 System.Web.Script.Serialization.JavaScriptSerializer ()에 대해 마음에 들지 않는 점은 항상 정의 된 유형 T가 필요하다는 것입니다. Java에는 모든 익명으로 유지되는이 org.java 라이브러리 (패키지)가 있습니다. "JSONObject [" param "]. JSONarray (5)"etc
스포츠

2
id 및 name 속성의 setter는 공용으로 남겨 두어야합니다. 개인 또는 보호로 설정된 경우 역 직렬화는 오류없이 실행되지만 모든 데이터는 null입니다.
Isaac Zais

2
@sports를 사용하면 동적으로 역 직렬화하여 C #에서 그렇게 할 수 있지만 알려진 유형으로 역 직렬화하면 성능이 훨씬 좋습니다.
PRMan

50

때로는 동적 객체를 선호합니다.

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);
}

이것이 유용한 인스턴스의 한 예는 직렬화를 해제하려는 객체에 인터페이스 인 속성이 포함 된 경우입니다.
soupy1976

2
순서대로 설명하겠습니다.
Peter Mortensen

@Icarus의 대답보다 왜 이것을 선호합니까?
Questioning

@Questioning, 강력한 유형의 클래스로 deserialize하면 클래스에없는 속성이 무시되고 동적 객체로 deserialize하면 클래스를 업데이트 할 필요없이 미래에 생성 된 새로운 속성에 융통성있는 동적 .Net 객체가 반환됩니다. (내가 말했듯이 때로는 표준이 아님)
Bishoy Hanna

39

이러한 클래스를 자동으로 생성하는 가장 좋은 방법은 JSON 출력을 복사하여 여기에 넣는 것입니다.

http://json2csharp.com/

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


28

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();

3
이 솔루션은 시간이 없거나 데이터 계약을 작성해야하는 경우 매우 유용합니다. 특히 JSON 구조에 깊이 묻혀있는 몇 가지 속성에만 관심이 있다면. 그러한 상황에서는 일련의 진술을 사용하여 필요한 것을 탐색 할 수 있습니다. 참고 : 역 직렬화 유형은 Dictionary <string, object> 또는 ArrayList (노드 반복 구조가있는 경우) 중 하나 일 수도 있습니다.
Philippe Monnet

1
Deserialize 코드 줄에 'System.String'유형에 대해 매개 변수가없는 생성자가 정의되어 있지 않습니다. 런타임 예외가 발생합니다.
RSK

20

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 직렬화를 사용하는 것이 좋습니다.


15

나는 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; }
}

3
새 버전에서는 동적을 사용하는 것이 좋습니다. public IList<IDictionary<string, dynmaic>> data { get; set; }
BJury

3

직렬화 :

// 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);

3

이 확장을 사용할 수 있습니다

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);
   }
}


1

당신이 사용하는 경우 .NET 코어 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.