>

직렬화 할 json 파일의 구조는 다음과 같습니다.

{
    "id" : "1lad07",
    "text" : "test",
    "url" : "http:\/\/twitpic.com\/1lacuz",
    "width" : 220,
    "height" : 84,
    "size" : 8722,
    "type" : "png",
    "timestamp" : "Wed, 05 May 2010 16:11:48 +0000",
    "user" : {
        "id" : 12345,
        "screen_name" : "twitpicuser"
    }
}

JavaScriptSerializer의 속성으로 파일 이름을 가진 클래스를 만들었습니다. json을 직렬화 해제하는 데 사용할 코드는 다음과 같습니다.

           using (var reader = new StreamReader(twitpicResponse.GetResponseStream())) {

                var responseBody = reader.ReadToEnd();
                var deserializer = new JavaScriptSerializer();
                var results = deserializer.Deserialize<Response>(responseBody);
            }

제 문제는 json 파일에서 사용자 필드를 읽는 방법입니다. 아래와 같습니다;

"user" : {
    "id" : 12345,
    "screen_name" : "twitpicuser"
}

하위 속성과 값이 있습니다. 응답 클래스에서 어떻게 이름을 지정할 수 있습니까? 내 응답 클래스는 이제 다음과 같습니다.

public class Response {
    public string id { get; set; }
    public string text { get; set; }
    public string url { get; set; }
    public string width { get; set; }
    public string height { get; set; }
    public string size { get; set; }
    public string type { get; set; }
    public string timestamp { get; set; }
}

가장 좋은 경우는 무엇입니까?


  • 답변 # 1

    <올>

    응답 클래스 User 와 같이 사용자 값을 보유하는 클래스를 작성해야합니다. .

    사용자 값 User 의 새 클래스 유형으로 응답 클래스 'user'에 특성을 추가하십시오. .

    public class Response {
        public string id { get; set; }
        public string text { get; set; }
        public string url { get; set; }
        public string width { get; set; }
        public string height { get; set; }
        public string size { get; set; }
        public string type { get; set; }
        public string timestamp { get; set; }
        public User user { get; set; }
    }
    public class User {
        public int id { get; set; }
        public string screen_name { get; set; }
    }
    
    

    일반적으로 json과 CLR 클래스의 속성 유형이 일치하는지 확인해야합니다.역 직렬화하려는 구조에 여러 숫자 값이 포함되어있는 것 같습니다 (대부분 int ). 나는 JavaScriptSerializer 인지 확실하지 않습니다  숫자를 문자열 필드에 자동으로 역 직렬화 할 수 있지만 가능한 한 실제 데이터에 최대한 가깝게 CLR 유형을 일치시켜야합니다.

  • 답변 # 2

    다른 클래스를 만들고 싶지 않다면, deserializer는 항상 다음과 같이 키-값 쌍의 사전을 제공 할 수 있습니다 :

    string s = //{ "user" : {    "id" : 12345,    "screen_name" : "twitpicuser"}};
    var serializer = new JavaScriptSerializer();
    var result = serializer.DeserializeObject(s);
    
    

    할 수있는 일을 되 찾을 수 있습니다 :

    var userId = int.Parse(result["user"]["id"]); // or (int)result["user"]["id"] depending on how the JSON is serialized.
    // etc.
    
    

    와이즈 비츠를보십시오  디버거에서 볼 수있는 내용이 있습니다.

  • 답변 # 3

    .Net 4+의 경우 :

    result
    
    
    .Net 2/3.5의 경우 : 이 코드는 1 레벨의 JSON에서 작동합니다

    samplejson.aspx

    string s = "{ \"user\" : {    \"id\" : 12345,    \"screen_name\" : \"twitpicuser\"}}";
    var serializer = new JavaScriptSerializer();
    dynamic usr = serializer.DeserializeObject(s);
    var UserId = usr["user"]["id"];
    
    

    2 단계 JSON의 경우 :

    sample2.aspx

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Globalization" %>
    <%@ Import Namespace="System.Web.Script.Serialization" %>
    <%@ Import Namespace="System.Collections.Generic" %>
    <%
    string s = "{ \"id\" : 12345,    \"screen_name\" : \"twitpicuser\"}";
    var serializer = new JavaScriptSerializer();
    Dictionary<string, object> result = (serializer.DeserializeObject(s) as Dictionary<string, object>);
    var UserId = result["id"];
     %>
     <%=UserId %>
    
    

  • 답변 # 4

    다음과 같이 id 필드와 screen_name 필드를 사용하여 하위 클래스 사용자를 만듭니다.

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Globalization" %>
    <%@ Import Namespace="System.Web.Script.Serialization" %>
    <%@ Import Namespace="System.Collections.Generic" %>
    <%
    string s = "{ \"user\" : {    \"id\" : 12345,    \"screen_name\" : \"twitpicuser\"}}";
    var serializer = new JavaScriptSerializer();
    Dictionary<string, object> result = (serializer.DeserializeObject(s) as Dictionary<string, object>);
    Dictionary<string, object> usr = (result["user"] as Dictionary<string, object>);
    var UserId = usr["id"];
     %>
     <%= UserId %>
    
    

  • 답변 # 5

    public class User
    {
        public string id { get; set; }
        public string screen_name { get; set; }
    }
    public class Response {
        public string id { get; set; }
        public string text { get; set; }
        public string url { get; set; }
        public string width { get; set; }
        public string height { get; set; }
        public string size { get; set; }
        public string type { get; set; }
        public string timestamp { get; set; }
        public User user { get; set; }
    }
    
    
    public class User : List<UserData> { public int id { get; set; } public string screen_name { get; set; } } string json = client.DownloadString(url); JavaScriptSerializer serializer = new JavaScriptSerializer(); var Data = serializer.Deserialize<List<UserData>>(json);

  • 이전 c# - 행에 2 개의 예외를 던지면 도달 할 수없는 코드 경고가 생성되지 않는 이유는 무엇입니까?
  • 다음 c - 대체 for 루프 구문