如何将字符串反序列化为对象(字符串格式与对象表示法类似)

时间:2017-07-25 15:33:19

标签: c# string object deserialization

我有一个看起来像这样的字符串。它不是JSON而不是XML。

app.config([
  '$interpolateProvider', function($interpolateProvider) {
    return $interpolateProvider.startSymbol('{(').endSymbol(')}');
  }
]);

以下是假设:

  1. 对象由{Foo={name=My Foo Value, active=true, some date=20170630}, Bar={name=My Bar Value}, Key With Space={name=Foo Bar, active=false}}
  2. 括起来
  3. 键可以在名称中包含空格
  4. 键由空格和逗号({}
  5. 分隔
  6. 通过等号
  7. 为值分配值
  8. 键可以有多个值,值由,括起,值内的值由空格和逗号({})分隔。例如,这是一个包含三个值的单个键:,
  9. 我的策略是首先反序列化为{My Foo Key={one=true, two=true, third value=false}},稍后担心递归。任何建议(现有的图书馆?)赞赏!

    以下是我的内容

    Dictionary<string, object

    TLDR 即可。 var stringContentTrimmed = stringContent.Substring(1, stringContent.Length - 2); var objects = stringContentTrimmed.Split(',') .Select(x => x.Trim()) .Where(x => !String.IsNullOrWhiteSpace(x)); 函数也将我的值分开,这不是我想要的。

    enter image description here

2 个答案:

答案 0 :(得分:2)

你真的需要有一个正确的规范或语法,但我会采取疯狂的猜测,并说没有一个,如果有,实际值将不符合它。

你最好的选择可能是:

  • 消除与= { },个字符相邻的任何空格
  • 将所有,替换为","
  • 将所有=替换为"="
  • 将所有{替换为{"
  • 将所有}替换为"}
  • 将所有"{替换为{
  • 将所有}"替换为}
  • 将所有=替换为:

然后视为JSON。

我用你的例子尝试了这个并且它有效。它是否适用于您的实际值我不知道 - 这将取决于它们是否坚持您所描述的限制。如果键或值嵌入"{}:=,中的任何一个或者前导空格或尾随空格是重要的,那么它将无效。

答案 1 :(得分:1)

我在下面创建了一个方法GetObjects,该方法返回顶级对象的Dictionary<string, string>和内部的原始内容。另一种方法Merge通过调用GetValues来从对象内容中提取键值对来返回嵌套字典。

使用示例字符串,Merge方法返回: enter image description here

class Program
{
    static void Main(string[] args)
    {
        var str = "{Foo={name=Foo Value, active=true, some date=20170630}, Bar={name#=My Bar Value}, Key With Space={name=Foo Bar, active=false}}";

        var values = GetObjects(str);

        Dictionary<string, Dictionary<string, string>> objects = Merge(values);
    }

    public static Dictionary<string, Dictionary<string, string>> Merge(Dictionary<string, string> input)
    {
        var output = new Dictionary<string, Dictionary<string, string>>();

        foreach (var key in input.Keys)
        {
            var value = input[key];
            var subValues = GetValues(value);

            output.Add(key, subValues);
        }

        return output;
    }

    public static Dictionary<string, string> GetObjects(string input)
    {
        var objects = new Dictionary<string, string>();
        var objectNames = new Queue<string>();
        var objectBuffer = string.Empty;

        foreach (var c in input)
        {
            if (char.Equals('{', c))
            {
                if (!string.IsNullOrEmpty(objectBuffer))
                {
                    var b = objectBuffer.Trim('{', '}', ',', ' ', '=');
                    objectNames.Enqueue(b);
                }

                objectBuffer = string.Empty;
            }

            if (char.Equals('}', c))
            {
                if (objectNames.Count > 0)
                {
                    var b = objectBuffer.Trim('{');
                    var key = objectNames.Dequeue();

                    objects.Add(key, b);
                }

                objectBuffer = string.Empty;
            }

            objectBuffer += c;
        }

        return objects;
    }

    private static Dictionary<string, string> GetValues(string input)
    {
        var output = new Dictionary<string, string>();
        var values = input.Split(new string[] { ", " }, System.StringSplitOptions.None);

        foreach (var val in values)
        {
            var parts = val.Split('=');
            if (parts.Length == 2)
            {
                var key = parts[0].Trim(' ');
                var value = parts[1].Trim(' ');
                output.Add(key, value);
            }
        }

        return output;
    }
}