将name=value格式的字符串反序列化为对象
本文关键字:字符串 反序列化 对象 格式 name value | 更新日期: 2023-09-27 18:03:11
我想读取文件,每个文件包含一个人的详细信息,如下所示,并将其转换为person对象。
下面的秘密
id=1
firstName=John
lastName=Smith
:
public class Person
{
public int Id {get;set;}
public string FirstName{get;set;}
public string LastName{get;set;}
}
有没有。net内置的方法来做到这一点,或者第三方库。我在google上找不到。
更新:
文件格式不能更改
。NET是真正的XML,所以您找不到类似于ini格式的内置功能。但是有一堆库可以很容易地读取和编写这样的文件,例如ini-parser或nini,但是你仍然需要手动完成对象之间的映射。
您可以使用String.Split
和LINQ:
Dictionary<string, string> dict = text
.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
.Select(e => e.Split('='))
.ToDictionary(strings => strings[0], strings => strings[1]);
然后使用Dictionary Adapter
例如使用File.ReadAllLines
,一点点Linq和String.Substring
?
var lines = File.ReadAllLines(path).Select(l => l.Trim());
var idLine = lines.FirstOrDefault(l => l.StartsWith("id=", StringComparison.OrdinalIgnoreCase));
var lNameLine = lines.FirstOrDefault(l => l.StartsWith("lastname=", StringComparison.OrdinalIgnoreCase));
var fNameLine = lines.FirstOrDefault(l => l.StartsWith("firstname=", StringComparison.OrdinalIgnoreCase));
if (idLine != null && lNameLine != null && fNameLine != null)
{
Person person = new Person()
{
Id = int.Parse(idLine.Substring(idLine.IndexOf("=") + 1)),
FirstName = fNameLine.Substring(fNameLine.IndexOf("=") + 1),
LastName = lNameLine.Substring(lNameLine.IndexOf("=") + 1)
};
}
(假设每个文件只有一个人)
但我会使用不同的格式,如XML(或数据库)。
我真的认为您应该考虑将您的输入数据格式更改为更标准的格式(如XML或JSON)。
但这并不意味着你不能读取你的文件。你应该自己阅读你的文本文件:
var people = new List<Person>();
using (var stream = File.OpenRead("Input.txt"))
{
using (var reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
int id = int.Parse(reader.ReadLine().Substring(3));
string firstName = reader.ReadLine().Substring(10);
string lastName = reader.ReadLine().Substring(9);
var newPerson = new Person()
{
Id = id,
FirstName = firstName,
LastName = lastName
};
people.Add(newPerson);
}
}
}
如果数据的格式如下:
<Person>
<Id>1</Id>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
</Person>
然后这段c#代码将描述为Person
的一个实例//assuming you have a string called "data" that contains the above XML.
XDocument xd=XDocument.Parse(data); //needs System.Xml.Linq for XDocument type.
using(var reader = xd.CreateReader())
{
using(XmlSerializer ser = new XmlSerializer(typeof(Person))
{
Person p = ser.Deserialize(reader) as Person;
//p will be null if it didn't work, so make sure to check it!
}
}
请注意,反序列化器是区分大小写的,因此您需要确保元素大小写与类中属性的大小写相匹配(您可以通过使用序列化器属性来修饰属性来解决这个问题,这些属性告诉序列化器如何将它们映射到这里)
普通的本机序列化器对于这样的简单对象非常好,但可能会在某些数据类型(如char, bool等)上绊倒您,因此请检查属性上的链接。
如果你想从你在问题中给出的格式做,你需要写一个自定义序列化器,在你的情况下,我的建议是从你的文件中读取,并使用XDocument希望从数据生成XML。