C#JSON反序列化异常
如果我尝试使用从列表或字典派生的根类反序列化一系列类,则会出现以下异常: “价值 \“System.Collections.Generic.Dictionary`2[System.String,System.Object]\” 不是“JSONTesting.UserInformation”类型,不能在中使用 此通用集合。\r\n参数名称:值“ 这是我用来创建JSON文件和反序列化它的代码。这只是一个小样本项目,演示了这个问题:C#JSON反序列化异常,c#,json,deserialization,C#,Json,Deserialization,如果我尝试使用从列表或字典派生的根类反序列化一系列类,则会出现以下异常: “价值 \“System.Collections.Generic.Dictionary`2[System.String,System.Object]\” 不是“JSONTesting.UserInformation”类型,不能在中使用 此通用集合。\r\n参数名称:值“ 这是我用来创建JSON文件和反序列化它的代码。这只是一个小样本项目,演示了这个问题: private void BuildUserInfo(obj
private void BuildUserInfo(object sender, EventArgs e)
{
Users users = new Users();
UserInformation userInformation;
//Item 1
userInformation = new UserInformation();
userInformation.Name = "John Doe";
userInformation.Age = "50";
userInformation.Addresses.Add(new Address("11234 Smith Pl.", "Orlando", "FL", "32789"));
userInformation.Addresses.Add(new Address("553 Park St.", "Boston", "MA", "02115"));
userInformation.PhoneNumbers.Add(new PhoneNumber("617", "111-2222", string.Empty));
userInformation.PhoneNumbers.Add(new PhoneNumber("508", "236-0173", "22734"));
users.Add(userInformation);
//Serialize
JavaScriptSerializer serializer = new JavaScriptSerializer();
StreamWriter streamOut = null;
string outString = string.Empty;
outString = serializer.Serialize(users);
streamOut = new StreamWriter("OUTFILE.JSON");
streamOut.Write(outString);
streamOut.Close();
}
private void ReadUserInfo(object sender, EventArgs e)
{
JavaScriptSerializer serializer;
StreamReader streamIn = null;
Users retrievedUsers = null;
if (File.Exists("OUTFILE.JSON"))
{
streamIn = new StreamReader("OUTFILE.JSON");
serializer = new JavaScriptSerializer();
retrievedUsers = serializer.Deserialize<Users>(streamIn.ReadToEnd());
streamIn.Close();
}
}
}
public class Users: List<UserInformation>
{
public UserInformation getUserByName(string name)
{
foreach (UserInformation user in this)
{
if (name == user.Name)
return user;
}
return null;
}
}
public class UserInformation
{
public string Name;
public string Age;
public List<Address> Addresses;
public List<PhoneNumber> PhoneNumbers;
public UserInformation()
{
Name = string.Empty;
Age = string.Empty;
Addresses = new List<Address>();
PhoneNumbers = new List<PhoneNumber>();
}
public UserInformation(string Name, string Age)
{
this.Name = Name;
this.Age = Age;
Addresses = new List<Address>();
PhoneNumbers = new List<PhoneNumber>();
}
}
public class Address
{
public string Street;
public string City;
public string State;
public string PostalCode;
public Address()
{
Street = string.Empty;
City = string.Empty;
State = string.Empty;
PostalCode = string.Empty;
}
public Address(string Street, string City, string State, string PostalCode)
{
this.Street = Street;
this.City = City;
this.State = State;
this.PostalCode = PostalCode;
}
}
public class PhoneNumber
{
public string AreaCode;
public string Number;
public string Extension;
public PhoneNumber()
{
AreaCode = string.Empty;
Number = string.Empty;
Extension = string.Empty;
}
public PhoneNumber(string AreaCode, string Number, string Extension)
{
this.AreaCode = AreaCode;
this.Number = Number;
this.Extension = Extension;
}
}
如果我更改Users类,使其不是从List派生的,而只是使其成为具有内部List集合的类,那么它就可以正常工作。例如:
public class Users
{
public List<UserInformation> UserItems = new List<UserInformation>();
}
公共类用户
{
public List UserItems=new List();
}
为了能够反序列化此JSON,我需要更改什么
编辑:尝试下面评论中的链接,我改为:
public class Users(IEnumerable<UserInformation> collection) : base (collection) {
}
公共类用户(IEnumerable集合):基(集合){
}
我发现生成错误:
错误1类、结构或接口成员中的无效标记“(”
声明c:\Local.NET
Projects\2010\JSONTesting1\Form1.cs 66 25 JSONTesting1错误2{
应为c:\Local.NET
Projects\2010\JSONTesting1\Form1.cs 66 25 JSONTesting1错误3;
应为c:\Local.NET
Projects\2010\JSONTesting1\Form1.cs 66 69 JSONTesting1错误4无效
类、结构或接口成员声明c:\Local中的标记“)”
.NET项目\2010\JSONTesting1\Form1.cs 66 93 JSONTesting1错误5}
应为c:\Local.NET
Projects\2010\JSONTesting1\Form1.cs 153 2 JSONTesting1
您是否必须使用JavaScriptSerializer
?如果您这样做,则必须有一些我们缺少的配置详细信息,但可以在不进行任何调整的情况下进行处理:
private static void BuildUserInfo()
{
// ...
//Serialize
File.WriteAllText("OUTFILE.JSON", Newtonsoft.Json.JsonConvert.SerializeObject(users));
}
private static void ReadUserInfo()
{
Users retrievedUsers = null;
if (File.Exists("OUTFILE.JSON"))
{
var json = File.ReadAllText("OUTFILE.JSON");
retrievedUsers = Newtonsoft.Json.JsonConvert.DeserializeObject<Users>(json);
}
}
private static void BuildUserInfo()
{
// ...
//连载
WriteAllText(“OUTFILE.JSON”,Newtonsoft.JSON.JsonConvert.SerializeObject(用户));
}
私有静态void ReadUserInfo()
{
用户retrievedUsers=null;
if(File.Exists(“OUTFILE.JSON”))
{
var json=File.ReadAllText(“OUTFILE.json”);
retrievedUsers=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);
}
}
它不起作用。我在我的帖子中添加了更多信息。你试图将JSON数组放入单个对象。尝试将retrievedUsers更改为列表,然后反序列化为列表list retrievedUsers=new list()
retrievedUsers=serializer.DeserializestreamIn.ReadToEnd())代码>我完全按照我想要的方式序列化它-将整个集合输出到一个JSON文件。我想将其反序列化为Users对象,这是UserInformation对象的集合。我想把整个东西带回到用户对象中。如果我更改Users类,使其不是从List派生的,那么它可以正常工作。使用Newtonsoft.Json
private static void BuildUserInfo()
{
// ...
//Serialize
File.WriteAllText("OUTFILE.JSON", Newtonsoft.Json.JsonConvert.SerializeObject(users));
}
private static void ReadUserInfo()
{
Users retrievedUsers = null;
if (File.Exists("OUTFILE.JSON"))
{
var json = File.ReadAllText("OUTFILE.JSON");
retrievedUsers = Newtonsoft.Json.JsonConvert.DeserializeObject<Users>(json);
}
}