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

7

我有如下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);

看看我的答案,了解如何使用ServiceStack完成这个操作:https://dev59.com/aGfWa4cB1Zd3GeqPdQ80#11877087 - mythz
这正是你要找的:https://dev59.com/RFkR5IYBdhLWcg3w2wt1#70026040 - Ash K
4个回答

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
谢谢,但如果可能的话,我正在寻找避免创建具体类型的方法。 - mohsen dorparasti
由于json内容是由<string,string>对组成的,所以我使用了dictionary<string,string>[]作为类型,并且它起作用了。 - mohsen dorparasti

2
您可以使用多种方式 在ServiceStack的JsonSerializer中动态解析JSON,例如:
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
    }
]

谢谢。但是现在,我不知道该选择哪个序列化器。哪一个性能更好? - mohsen dorparasti
1
毫无疑问是ServiceStack :) http://www.servicestack.net/benchmarks/#burningmonk-benchmarks - mythz

1

1
谢谢,但是这只适用于JSON仅包含一个项目的情况,而这里包含多个项目。我需要提取匿名对象的列表或数组。 - mohsen dorparasti

0
以下示例可以使用NewtonSoft.JsonDeserializeAnonymousType方法将JSON反序列化为匿名对象列表
var json = System.IO.File.ReadAllText(@"C:\TestJSONFiles\yourJSONFile.json");
var fooDefinition = new { a = "", b = 0 }; // type with fields of string, int
var fooListDefinition = Enumerable.Range(0, 0).Select(e => fooDefinition).ToList();

var foos = JsonConvert.DeserializeAnonymousType(json, fooListDefinition);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接