C# 对象数组。JSON反序列化。请建议

C# 对象数组。JSON反序列化。请建议,c#,asp.net,arrays,json,list,C#,Asp.net,Arrays,Json,List,我正在使用一个返回JSON字符串的web服务 String str =[{"users":{"company":"abc","contact_Number":"999999999"}}, {"users":{"company":"xyz","contact_Number":"888888888"}}, {"users":{"company":"xxx","contact_Number":"555555555"}}, ] 无法反序列化 clas

我正在使用一个返回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
{
公共用户[]用户{get;set;}
//公众联络人名单;
}
公共类用户
{
公共字符串公司
{
得到;
设置
}
公共字符串联系人号码
{
得到;
设置
}
}
JavaScriptSerializer sr=新的JavaScriptSerializer();
jsonmenuwrapper sr1=sr.Deserialize(str);
抛出错误。。数组的反序列化不支持jsonmenuwrapper


有人能指引我吗?谢谢..

看起来您正在向一组对象投射字符串。。。我希望它会抛出异常,但事实并非如此,因此请尝试以下方法:

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

看起来您正在将字符串强制转换为一个对象数组。。。我希望它会抛出异常,但事实并非如此,因此请尝试以下方法:

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

实际上,您正在反序列化一组用户。根本不需要
jsonmenuwrapper

只需更改1行:

List<user> sr1 = sr.Deserialize<List<user>>(str);
List sr1=sr.Deserialize(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);
    }
}
公共类jsonmenuwrapper
{
公共用户用户{get;set;}
}
公共类用户
{
公共字符串公司{get;set;}
公共字符串联系人号码{get;set;}
}
[测试夹具]
公共类JsonTests
{
[测试]
公共无效TestArrayDeserialization()
{
常量字符串str=
@“[{”“用户”“:{”“公司”“:”“abc”“联系电话”“:”“99999999”“}”,
{“用户”:{“公司”:“xyz”,“联系人号码”:“88888888”},
{“用户”:{“公司”:“xxx”,“联系人号码”:“5555555”}}];
var serializer=新的JavaScriptSerializer();
var data=serializer.Deserialize(str);
Assert.AreEqual(3,data.Count);
Assert.AreEqual(“abc”,数据[0]。用户。公司);
Assert.AreEqual(“99999999”,数据[0]。用户。联系电话);
Assert.AreEqual(“xyz”,数据[1]。users.company);
Assert.AreEqual(“88888888”,数据[1]。用户。联系电话);
Assert.AreEqual(“xxx”,数据[2]。users.company);
Assert.AreEqual(“555”,数据[2]。用户。联系电话号码);
}
}

您实际上是在反序列化一组用户。根本不需要
jsonmenuwrapper

只需更改1行:

List<user> sr1 = sr.Deserialize<List<user>>(str);
List sr1=sr.Deserialize(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);
    }
}
公共类jsonmenuwrapper
{
公共用户用户{get;set;}
}
公共类用户
{
公共字符串公司{get;set;}
公共字符串联系人号码{get;set;}
}
[测试夹具]
公共类JsonTests
{
[测试]
公共无效TestArrayDeserialization()
{
常量字符串str=
@“[{”“用户”“:{”“公司”“:”“abc”“联系电话”“:”“99999999”“}”,
{“用户”:{“公司”:“xyz”,“联系人号码”:“88888888”},
{“用户”:{“公司”:“xxx”,“联系人号码”:“5555555”}}];
var serializer=新的JavaScriptSerializer();
var data=serializer.Deserialize(str);
Assert.AreEqual(3,data.Count);
Assert.AreEqual(“abc”,数据[0]。用户。公司);
Assert.AreEqual(“99999999”,数据[0]。用户。联系电话);
Assert.AreEqual(“xyz”,数据[1]。users.company);
Assert.AreEqual(“88888888”,数据[1]。用户。联系电话);
Assert.AreEqual(“xxx”,数据[2]。users.company);
Assert.AreEqual(“555”,数据[2]。用户。联系电话号码);
}
}

您的类不需要标记为可序列化的吗

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

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

您的类不需要标记为可序列化吗

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

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

在OBJ的末尾有一个额外的
;可能是复制粘贴错误,但我认为值得指出。下面是关于类似问题的答案:您的OBJ末尾有一个额外的
;可能是复制粘贴错误,但我认为值得指出。下面是关于类似问题的答案: