将json反序列化为匿名类型列表

时间:2012-08-08 18:33:37

标签: asp.net json anonymous-types servicestack

我有一个json如下:

  "[{"a":"b","c":"d"},{"a":"e","c":"f"},{"a":"g","c":"h"}]"

现在我想把它变成匿名类型“foo”

的对象列表
  var foo=new { a=string.empty , c=string.empty };

代码是:

  ServiceStackJsonSerializer Jserializer = new ServiceStackJsonSerializer();
  dynamic foos = Jserializer.Deserialize<List<foo.GetType()>>(jsonString);

但没有工作。

更新:

ServiceStack替换为JavascriptSerializer并传递dictionary[]解决了问题,而无需anonymous输入

        JavaScriptSerializer jSerializer = new JavaScriptSerializer();
        var Foos = jSerializer.Deserialize<Dictionary<string, object>[]>(jsonString);

3 个答案:

答案 0 :(得分:2)

我不知道Jserializer类是什么,但我知道JavaScriptSerializer类。不幸的是,它不支持反序列化为匿名类型。你必须创建一个这样的具体类型:

class Foo
{
    public string a { get; set; }

    public string c { get; set; }
}

使用以下代码为我工作:

const string json =
    @"[{""a"":""b"",""c"":""d""},{""a"":""e"",""c"":""f""},{""a"":""g"",""c"":""h""}]";

var foos = new JavaScriptSerializer().Deserialize<Foo[]>(json);

变量foos将包含Foo个实例的数组。

答案 1 :(得分:2)

您可以通过多种方式dynamically parse JSON with ServiceStack's JsonSerializer例如:

var json = "[{\"a\":\"b\",\"c\":\"d\"},{\"a\":\"e\",\"c\":\"f\"},{\"a\":\"g\",\"c\":\"h\"}]";

var dictionary = json.FromJson<List<Dictionary<string, string>>>();
".NET Collections:".Print();
dictionary.PrintDump();

List<JsonObject> map = JsonArrayObjects.Parse(json);
"Dynamically with JsonObject:".Print();
map.PrintDump();

使用ServiceStack's T.Dump() extension method打印出来:

.NET Collections:
[
    {
        a: b,
        c: d
    },
    {
        a: e,
        c: f
    },
    {
        a: g,
        c: h
    }
]
Dynamically with JsonObject:
[
    {
        a: b,
        c: d
    },
    {
        a: e,
        c: f
    },
    {
        a: g,
        c: h
    }
]

答案 2 :(得分:1)

对于你想要做的事情,听起来像json.net会更合适。看到这个问题 Deserialize json object into dynamic object using Json.net