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