C# 对象数组。JSON反序列化。请建议
我正在使用一个返回JSON字符串的web服务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
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末尾有一个额外的,
;可能是复制粘贴错误,但我认为值得指出。下面是关于类似问题的答案: