我有一个看起来像这样的字符串。它不是JSON而不是XML。
app.config([
'$interpolateProvider', function($interpolateProvider) {
return $interpolateProvider.startSymbol('{(').endSymbol(')}');
}
]);
以下是假设:
{Foo={name=My Foo Value, active=true, some date=20170630}, Bar={name=My Bar Value}, Key With Space={name=Foo Bar, active=false}}
{}
),
括起,值内的值由空格和逗号({}
)分隔。例如,这是一个包含三个值的单个键:,
我的策略是首先反序列化为{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));
函数也将我的值分开,这不是我想要的。
答案 0 :(得分:2)
你真的需要有一个正确的规范或语法,但我会采取疯狂的猜测,并说没有一个,如果有,实际值将不符合它。
你最好的选择可能是:
=
{
}
或,
个字符相邻的任何空格,
替换为","
=
替换为"="
{
替换为{"
}
替换为"}
"{
替换为{
}"
替换为}
=
替换为:
然后视为JSON。
我用你的例子尝试了这个并且它有效。它是否适用于您的实际值我不知道 - 这将取决于它们是否坚持您所描述的限制。如果键或值嵌入"{}:=,
中的任何一个或者前导空格或尾随空格是重要的,那么它将无效。
答案 1 :(得分:1)
我在下面创建了一个方法GetObjects
,该方法返回顶级对象的Dictionary<string, string>
和内部的原始内容。另一种方法Merge
通过调用GetValues
来从对象内容中提取键值对来返回嵌套字典。
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;
}
}