3

編集:以下の問題は、「アイテム」配列に配置されている「バー」ラベルにあるようです。「JavaScriptSerializer」と「NewtonSoft」ツールを使用しようとしましたが、そのコレクションが配置されているとエラーになります。エラー: 現在の JSON オブジェクト (例: {\"name\":\"value\"}) を型 'System.Collections.Generic.List... に逆シリアル化できません...

RESTful Web サービスへの呼び出しから JSON 戻り文字列を取得しました。これを C# オブジェクトに変換する方法を見つけました。

JSON の例:

{
"property1": "value1",
"property2": "value2"
}

JSON が解析するクラスの例:

public class FooClass
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}

System.Web.Extensions 名前空間で「JavaScriptSerializer」クラスを使用しています...うまくいきます!

では、JSON にコレクション アイテムがある場合はどうでしょうか。そのようです:

{
"property1": "value1",
"property2": "value2",
"bars": {
"items": [
{
"sub_property1": "sub_value1",
"sub_property2": "sub_value2"
},
...
]
}
}

そして、「FooClass」クラスに対して次のようなことをしたい:

public class FooClass
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public List<BarClass> Bars { get; set; }
}

public class BarClass
{
public string Sub_Property1 { get; set; }
public string Sub_Property2 { get; set; }
}

JavaScriptSerializer クラスに、「アイテム」配列が「バー」と同等であることを伝えて、クラスに「解析」できるようにする方法はありますか?

ここでアドバイスをいただければ幸いです。

4

2 に答える 2

1

確かに -- この動作は自動的に行われます。重要なことは、BarClass にパラメーターのないコンストラクターがあることです (これは一般にシリアル化クラスにも共通していると思います)。JavaScriptSerializer の逆シリアル化メソッドは、オブジェクトの再構成に使用する型を受け取り、クラス内のすべてのサブタイプを処理します。

MSDN のドキュメントから: 「逆シリアル化中に、シリアライザーの現在の型リゾルバーが参照されます。これにより、配列内にネストされた要素とディクショナリ型を変換するときに使用するマネージド型が決定されます。その結果、逆シリアル化プロセスは、のすべてのネストされた要素を反復処理します。入力。"

using System.Collections.Generic; 
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
    class Program
    {


        private static void Main(string[] args)
        {
            var person = new Person();
            person.Name = "reacher gilt";
            person.Address = "100 East Way";
            person.Age = 74; 
            person.Aliases = new List<string>(new []{"teddy", "freddy", "eddy", "Betty"});
            person.Bars = new List<BarClass>(new[]{ 
                new BarClass("beep","boop"),
                new BarClass("meep","moop"),
                new BarClass("feep","foop"),
            });
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            string jsonString = serializer.Serialize(person);

            var rehydrated = serializer.Deserialize<Person>(jsonString);
        }

    }


    class Person
    {
        public string Name { get; set; }

        public string Address { get; set; }

        public int Age { get; set; }

        public List<string> Aliases;
        public List<BarClass> Bars { get; set; }
    }
    class BarClass
    { 
        public string Sub_Property1 { get; set; }
        public string Sub_Property2 { get; set; }
        public BarClass() { }
        public BarClass (string one, string two)
        {
            Sub_Property1 = one;
            Sub_Property2 = two;
        }
    }
}

編集:ロブコーチの明確なコメントの後:

using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
    class Program
    {


        private static void Main(string[] args)
        {
            var person = new Person();
            person.Name = "reacher gilt";
            person.Address = "100 East Way";
            person.Age = 74; 
            person.Aliases = new List<string>(new []{"teddy", "freddy", "eddy", "Betty"});
            person.Bars = new Dictionary<string, List<BarClass>>();

            person.Bars.Add("items",
                new List<BarClass>(new[]{ 
                new BarClass("beep","boop"),
                new BarClass("meep","moop"),
                new BarClass("feep","foop"),
            }));
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            string jsonString = serializer.Serialize(person);

            var rehydrated = serializer.Deserialize<Person>(jsonString);
        }

    }


    class BarClass
    { 
        public string Sub_Property1 { get; set; }
        public string Sub_Property2 { get; set; }
        public BarClass() { }
        public BarClass (string one, string two)
        {
            Sub_Property1 = one;
            Sub_Property2 = two;
        }
    }

    class Person
    {
        public string Name { get; set; }

        public string Address { get; set; }

        public int Age { get; set; }

        public List<string> Aliases;
        public Dictionary <string, List<BarClass> >Bars { get; set; }
    }
}

次のようなjsonを取得します。

{
    "Aliases":
    [
        "teddy",
        "freddy",
        "eddy",
        "Betty"
    ],
    "Name":"reacher gilt",
    "Address":"100 East Way",
    "Age":74,
    "Bars":
    {
        "items":
        [
            {
                "Sub_Property1":"beep",
                "Sub_Property2":"boop"
            },

            {
                "Sub_Property1":"meep",
                "Sub_Property2":"moop"
            },

            {
                "Sub_Property1":"feep",
                "Sub_Property2":"foop"
            }
        ]
    }
}

また、DataContractJsonSerializer を使用している人もいますが、これは実際にはjson にシリアル化する1 つの方法ですが、質問では System.Web.Script.Serialization.JavaScriptSerializer が指定されていました。

于 2012-07-10T22:38:46.870 に答える
0

これを試して:

[DataContract]
public class FooClass
{
    [DataMember]
    public string Property1 { get; set; }

    [DataMember]
    public string Property2 { get; set; }

    [DataMember]
    public Bars Bars { get; set; }
}

[DataContract]
public class Bars
{
    [DataMember]
    public List<Item> Items { get; set; }
}

[DataContract]
public class Item
{
    [DataMember]
    public string Sub_Property1 { get; set; }

    [DataMember]
    public string Sub_Property2 { get; set; }
}
于 2012-07-11T03:00:28.283 に答える