37

逆シリアル化する 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"
}

サブプロパティと値があります。Response クラスでどのように名前を付けることができますか。私の応答クラスは次のようになります。

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

}

それを行うのに最適なケースは何ですか?

4

6 に答える 6

39
  1. 応答クラスと同様に、ユーザー値を保持するクラスを作成する必要がありますUser
  2. user values の新しいクラスのタイプを使用して、Response クラス '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 型を一致させるようにしてください。

于 2011-03-31T15:25:50.390 に答える
20

別のクラスを作成したくない場合は、次のように、いつでもデシリアライザーにキーと値のペアの辞書を提供させることができます。

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デバッガーを見て、そこにあるものを確認してください。

于 2011-03-31T15:28:00.230 に答える
10

.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 で動作するはずです。

サンプルjson.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 の場合:

sample2.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 %>
于 2015-07-08T00:35:29.713 に答える
3

次のように、id フィールドと screen_name フィールドを持つサブクラス User を作成します。

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; }
}
于 2011-03-31T15:27:56.940 に答える