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);

但不工作。

更新 :

替换ServiceStackJavascriptSerializer传递dictionary[]解决了问题,无需anonymous键入

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

4 回答 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

于 2012-08-08T18:48:41.607 回答
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
    }
]
于 2012-08-09T05:04:26.673 回答
1

对于您正在尝试做的事情,听起来 json.net 会更合适。看到这个问题 Deserialize json object into dynamic object using Json.net

于 2012-08-08T18:51:19.490 回答
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);
于 2021-11-18T19:17:34.400 回答