反序列化JSON到匿名类型的列表(deserialize json into list of anonymous type)

我有如下一个JSON:

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

现在我想deserilize到匿名类型为“foo”的对象列表这个

  var foo=new { a=string.empty , c=string.empty };

代码如下:

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

但不工作。

更新:

更换ServiceStackJavascriptSerializer并通过dictionary[]解决了这个问题,而不需要anonymous类型

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

Answer 1:

我不知道是什么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实例。



Answer 2:

有多种方法可以动态地解析JSON与ServiceStack的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的T.Dump()扩展方法打印出来:

.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
    }
]


Answer 3:

对于你正在尝试做的,它听起来就像json.net将是一个更好的选择。 看到这个问题, 反序列化JSON对象为使用Json.net动态对象