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

Posted

技术标签:

【中文标题】将 json 反序列化为匿名类型列表【英文标题】:deserialize json into list of anonymous type 【发布时间】: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);

【问题讨论】:

查看我的答案以了解如何使用 ServiceStack 完成此操作:***.com/questions/11870906/… 【参考方案1】:

以下示例可以使用NewtonSoft.Json 的DeserializeAnonymousType 方法将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
    
]

【讨论】:

谢谢。但是现在,我不知道该选择哪个序列化程序。哪个性能更好? ServiceStack 到目前为止 :) servicestack.net/benchmarks/#burningmonk-benchmarks【参考方案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 并且它有效

以上是关于将 json 反序列化为匿名类型列表的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 反序列化为匿名对象

我可以将匿名类型序列化为 xml 吗?

使用 System.Text.Json 反序列化匿名类型

json字符串反序列化成匿名类型对象

C# 是否可以将 动态或匿名类型 转成 强类型 ?

为啥这个匿名类型不能使用 JsonConvert.DeserializeAnonymousType 正确反序列化?