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

时间:2015-03-09 14:47:03

标签: c# keyvaluepair

该对象有139个字段;字符串初始值设定项可能包含部分或全部这些字段。它的格式如下:" FirstName":" Bart"," LastName":" Simpson"," Company" :" Fat Tony","地址":" 55 Maple Drive"我可以找到这样的字段:

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

等等。但有更简洁的方法吗?

3 个答案:

答案 0 :(得分:1)

看到你的格式与JSON非常相似(实际上缺少大括号),因为人们评论说你通过使用JSON.NET会更好。

如果你完全控制了这个字符串,只需将其转换为json并反序列化它:

JsonConvert.DeserializeObject<YourClass>(yourString);

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

如果您无法控制此格式,并且无论如何都需要解析它,只需竖起大括号就可以了:

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

如果您没有针对此类的特定课程,也可以将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);
    }
}

这是一个额外的小提琴:

https://dotnetfiddle.net/fudUYZ

答案 1 :(得分:0)

使用正则表达式,你可以这样做:

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

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

答案 2 :(得分:0)

您可以创建一个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];
}

警告。由于我实际上并不知道您使用此代码的内容,因此这比使用代码更为一般。