如何在 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:
对象有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: