【问题标题】:How to initialize an object from a string containing key value pairs in C#如何在 C# 中从包含键值对的字符串初始化对象
【发布时间】:2015-03-09 23:13:08
【问题描述】:

对象有 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

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

【问题讨论】:

  • 我假设您没有使用 JSON.NET。如果是这种情况,那么您可以尝试一下。 (stackoverflow.com/questions/6620165/how-to-parse-json-in-c)
  • 我正在使用 C#;不是 JSON。
  • @Ron - 你的“字符串初始化器”看起来很像 JSON
  • 不,我的意思是你的字符串中的结构是 Json 结构。您可以借助 JSON.NET 库轻松解析它。
  • @Ron C# 和 JSON 不是独占的。

标签: c# keyvaluepair


【解决方案1】:

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

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

JsonConvert.DeserializeObject<YourClass>(yourString);

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

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

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

如果您对此没有特定的类,您也可以将YourClass 替换为Dictionary&lt;string,object&gt;

你会发现这个库是 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

【讨论】:

    【解决方案2】:

    你可以使用正则表达式:

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

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

    【讨论】:

      【解决方案3】:

      您可以创建一个Dictionary&lt;string,object&gt; 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];
      }
      

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

      【讨论】:

        猜你喜欢
        • 2012-09-15
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        相关资源
        最近更新 更多