【问题标题】:deserialize json into list of anonymous type将 json 反序列化为匿名类型列表
【发布时间】:2012-08-05 22:33:48
【问题描述】:

我有一个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);

但不工作。

更新:

JavascriptSerializer 替换ServiceStack 并传递dictionary[] 解决了问题,无需anonymous 类型

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

【问题讨论】:

标签: asp.net json anonymous-types servicestack


【解决方案1】:

以下示例可以使用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);

【讨论】:

    【解决方案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
        }
    ]
    

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 谢谢,但如果 json 仅包含一项,但这里它包含多个项,则此方法有效。我需要提取匿名对象的列表或数组
    【解决方案4】:

    我不知道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 实例的数组。

    【讨论】:

    • 谢谢,但我正在寻找一种方法来尽可能避免创建具体类型。
    • 因为 json 内容是由 对组成的,我使用 dictionary[] 作为 Type 并且它有效
    猜你喜欢
    • 2015-03-17
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多