将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上找不到。

更新:

文件格式不能更改

将name=value格式的字符串反序列化为对象

。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。

相关文章: