0

JSON 文字列を返す Web サービスを使用しています。

String str =[{"users":{"company":"abc","contact_Number":"999999999"}},
             {"users":{"company":"xyz","contact_Number":"888888888"}},
             {"users":{"company":"xxx","contact_Number":"555555555"}},
]

デシリアライズできません。

class jsonmenuwrapper
        {
            public user[] users{ get; set; }
           // public List<user> listcontacts;
        }



public class user
        {
            public String company
            {
                get;
                set;
            }
            public String contact_Number
            {
                get;
                set;
            }
}

JavaScriptSerializer sr= new JavaScriptSerializer();           

jsonmenuwrapper sr1 = sr.Deserialize<jsonmenuwrapper>(str);

スロー エラー.. jsonmenuwrapper' は、配列の逆シリアル化ではサポートされていません。

誰かが私を案内してもらえますか?ありがとう..

4

3 に答える 3

2

実際には、ユーザーの配列を逆シリアル化しています。jsonmenuwrapperクラスはまったく必要ありません。

1行を変更するだけです:

List<user> sr1 = sr.Deserialize<List<user>>(str);

より良い答え

実際、逆シリアル化しようとしているデータ構造はラッパー オブジェクトの配列ですが、各ラッパーには、配列ではなく 1 つの「ユーザー」しか含まれていません。これは、その動作を示す単体テストを使用した動作セットアップです。

public class jsonmenuwrapper
{
    public user users { get; set; }
}

public class user
{
    public String company { get; set; }
    public String contact_Number { get; set; }
}

[TestFixture]
public class JsonTests
{
    [Test]
    public void TestArrayDeserialization()
    {
        const string str =
@"[{""users"":{""company"":""abc"",""contact_Number"":""999999999""}},
{""users"":{""company"":""xyz"",""contact_Number"":""888888888""}},
{""users"":{""company"":""xxx"",""contact_Number"":""555555555""}}]";

        var serializer = new JavaScriptSerializer();
        var data = serializer.Deserialize<List<jsonmenuwrapper>>(str);

        Assert.AreEqual(3, data.Count);

        Assert.AreEqual("abc", data[0].users.company);
        Assert.AreEqual("999999999", data[0].users.contact_Number);

        Assert.AreEqual("xyz", data[1].users.company);
        Assert.AreEqual("888888888", data[1].users.contact_Number);

        Assert.AreEqual("xxx", data[2].users.company);
        Assert.AreEqual("555555555", data[2].users.contact_Number);
    }
}
于 2012-07-31T22:02:03.500 に答える
1

文字列をオブジェクトの配列にキャストしているようです...例外がスローされると思いますが、そうではないので、これを試してください:

String str ="[{\"users\":{\"company\":\"abc\",\"contact_Number\":\"999999999\"}},
             {\"users\":{\"company\":\"xyz\",\"contact_Number\":\"888888888\"}},
             {\"users\":{\"company\":\"xxx\",\"contact_Number\":\"555555555\"}}
]";
于 2012-07-31T21:37:12.083 に答える
0

クラスをマークする必要はありませんSerializableか?

[Serializable]
public class jsonmenuwrapper
{
//...
}

[Serializable]
public class user
{
//...
}
于 2013-02-10T21:32:40.990 に答える