如何将JSON中的空格反序列化为IList <keyvaluepair <string,object =“” >>?

时间:2019-05-29 09:29:43

标签: c# json servicestack keyvaluepair

我在将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>>

3 个答案:

答案 0 :(得分:1)

您不能在此处使用IListList,因为您的源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