JavaScriptSerializer()를 사용한 JSON 파일의 역직렬화
역직렬화할 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 필드를 어떻게 읽느냐가 문제입니다.이하와 같습니다.
"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; }
}
그것을 하기에 가장 좋은 경우는 무엇인가?
- 응답 클래스와 마찬가지로 사용자 값을 유지하는 클래스를 만들어야 합니다.
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 유형을 일치시켜야 합니다.
다른 클래스를 만들지 않을 경우 다음과 같이 언제든지 역직렬라이저에 키-값 쌍의 사전을 제공할 수 있습니다.
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.
보다result
디버거에 뭐가 들어있는지 확인하려고요
.Net 4+의 경우:
string s = "{ \"user\" : { \"id\" : 12345, \"screen_name\" : \"twitpicuser\"}}";
var serializer = new JavaScriptSerializer();
dynamic usr = serializer.DeserializeObject(s);
var UserId = usr["user"]["id"];
.Net 2/3.5의 경우: 이 코드는 1레벨의 JSON에서 동작합니다.
samplejson.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 %>
2레벨 JSON의 경우:
샘플 2.aspx
<%@ 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 %>
다음과 같이 id 필드와 screenn_name 필드를 사용하여 하위 클래스를 만듭니다.
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);
//Page load starts here
var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new
{
api_key = "my key",
action = "categories",
store_id = "my store"
});
var json2 = "{\"api_key\":\"my key\",\"action\":\"categories\",\"store_id\":\"my store\",\"user\" : {\"id\" : 12345,\"screen_name\" : \"twitpicuser\"}}";
var list = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<FooBar>(json);
var list2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<FooBar>(json2);
string a = list2.action;
var b = list2.user;
string c = b.screen_name;
//Page load ends here
public class FooBar
{
public string api_key { get; set; }
public string action { get; set; }
public string store_id { get; set; }
public User user { get; set; }
}
public class User
{
public int id { get; set; }
public string screen_name { get; set; }
}
언급URL : https://stackoverflow.com/questions/5502245/deserializing-a-json-file-with-javascriptserializer
'source' 카테고리의 다른 글
리액트 네이티브에서 이미지 폭을 100%로 설정하고 높이를 자동화하는 방법 (0) | 2023.04.04 |
---|---|
jq를 사용하여 JSON에서 키 이름을 가져오는 방법 (0) | 2023.04.04 |
Yesod의 예외 (0) | 2023.04.04 |
Angular JS - 양식 억제 제출 취소 버튼 (0) | 2023.04.04 |
Angularjs에서 여러 개의 제출을 방지하기 위해 클릭 한 번 후 제출 버튼을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.04.04 |