如何在 C# 中从包含键值对的字符串初始化对象

How to initialize an object from a string containing key value pairs in C#

对象有139个字段;字符串初始值设定项可能具有部分或全部这些字段。它的格式如下:"FirstName":"Bart","LastName":"Simpson","Company":"Fat Tony's","Address":"55 Maple Drive”等。我可以像这样查找字段:

if (initializerString.contains("FirstName:") 
   FirstName="get the next series of chars until the ", or end of string

等等。但是有没有更紧凑的方法来做到这一点?

使用正则表达式你可以做到:

 string firstName = Regex.Match(yourstring,@"(?<=""FirstName"":"").*?(?="")").Value;

然而,这确实看起来像一个 json 字符串,并且有更简单的方法来获取您的数据。

您可以创建一个 Dictionary<string,object> dict,其中包含 属性 和 属性 的名称。

然后您可以拆分字符串,

//Remove the "
initializerString = initializerString.Replace('"', '');
//Split by ,
var tmp = initializerString.Split(",");

//Foreach pair key/value split by :
foreach( var x in tmp){
    var tmp2=x.Split(":");

    //Assign the value to the property in the Dictionary
    dict[tmp2[0]]=tmp2[1];
}

警告。由于我实际上并不知道您将此代码用于什么目的,因此这更像是一个通用的想法,而不是工作代码。

鉴于您的格式与 JSON 非常相似(实际上除了缺少大括号),正如人们评论的那样,使用 JSON.NET 会更好。

如果您可以完全控制这个字符串,只需将其转换为 json 并反序列化即可:

JsonConvert.DeserializeObject<YourClass>(yourString);

它会在反序列化数据时自动设置正确的属性。

如果您无法控制这种格式,并且无论如何都需要对其进行解析,只需将大括号括起来就可以了:

JsonConvert.DeserializeObject<YourClass>("{" + yourString + "}");

如果您没有特定的 class,您也可以将 YourClass 替换为 Dictionary<string,object>

您会发现此库为 Newtonsoft.Json,我相信它是处理 JSON 数据的最受欢迎的库。

我做了一个工作示例,所以你可以看到它的实际效果(注意我保留了你的字符串格式,但请尝试直接使用 json):

using System;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Program
{
    public class Information
    {
        public string FirstName{get;set;}
        public string LastName{get;set;}
        public string Company{get;set;}
        public string Address{get;set;}
    }

    public static void Main()
    {
        string myObject =  "\"FirstName\":\"Bart\",\"LastName\":\"Simpson\",\"Company\":\"Fat Tony's\",\"Address\":\"55 Maple Drive\"";
        var converted = JsonConvert.DeserializeObject<Dictionary<string, object>>("{"+myObject+"}");
        var converted2 = JsonConvert.DeserializeObject<Information>("{"+myObject+"}");
        Console.WriteLine(String.Join("\n", converted.Select(c=> c.Key + ": " + c.Value)));
        Console.WriteLine(converted2.FirstName);
    }
}

还有红包fiddle:

https://dotnetfiddle.net/fudUYZ