我在将JSON反序列化为对象时遇到了一个大问题。应该将其反序列化为IList<KeyValuePair<string, object>>
的问题是键具有空格。
"spec": {
"SOMETHING WITH SPACES" : "10"
etc.
...
}
public class SomeObject
{
...
public IList<KeyValuePair<string, object>> spec{ get; set; }
...
}
反序列化代码:
var sr = new ServiceStack.Text.JsonSerializer<SomeObject>();
var esResult = sr.DeserializeFromString(responseJson);
responseJson
是ElasticSearch的GET。
我进入我的领域是空的。
如果我有没有空格的键,它通常会反序列化,并且我会得到IList<KeyValuePair<string, object>>
答案 0 :(得分:1)
您不能在此处使用IList
或List
,因为您的源JSON中没有[ ]
,这是您要解析为此类集合的要求。换句话说,如果没有[ ]
,就无法解析成一个集合,至少要经历很多麻烦才能做到这一点。
相反,您需要使用注释中已经建议的字典。
注意:我使用Newtonsoft JsonConvert是因为您没有说明解析器是什么,但这对我的论点几乎没有影响。
工作代码:
var json = "{ \"spec\": { \"SOMETHING WITH SPACES\" : \"10\" } }";
var someObj = JsonConvert.DeserializeObject<SomeObject>(json);
public class SomeObject
{
public Dictionary<string, object> spec{ get; set; }
}
之后,您可以将spec
属性强制转换为IEnumerable
并遍历找到的内容:
foreach (var pair in someObj.spec as IEnumerable<KeyValuePair<string, object>>)
{
Console.WriteLine(pair.Key + " -> " + pair.Value);
}
甚至将其转换为列表:
var list = someObj.spec.ToList();
foreach (var pair in list)
{
Console.WriteLine(pair.Key + " -> " + pair.Value);
}
.NET小提琴:https://dotnetfiddle.net/15l2R3
答案 1 :(得分:0)
我想您的JSON serialiazer会带来一些麻烦。我建议使用Newtonsoft.Json(在NuGet中) 我试过下面的代码,它工作正常:
var o1 = new SomeObject() { spec = new List<KeyValuePair<string, object>>() };
o1.spec.Add(new KeyValuePair<string, object>("test with spaces", 10));
var r1 = Newtonsoft.Json.JsonConvert.SerializeObject(o1);
Console.WriteLine(r1);
var o2 = Newtonsoft.Json.JsonConvert.DeserializeObject<SomeObject>(r1);
var r2 = Newtonsoft.Json.JsonConvert.SerializeObject(o2);
Console.WriteLine(r2);
结果是
{"spec":[{"Key":"test with spaces","Value":10}]}
{"spec":[{"Key":"test with spaces","Value":10}]}
没有空值,一切正常。
编辑:我实际上没有任何理由,为什么空格应该是任何问题。它们只是字符串的一部分。
答案 2 :(得分:0)
如果您不介意使用Newtonsoft.Json:
col7_id