使用动态密钥反序列化JSON
我对JSON很新,目前正在学习(de)序列化。 我正在从网页中检索JSON字符串并尝试将其反序列化为对象。 问题是,根json密钥是静态的,但底层密钥是动态的,我无法预期它们反序列化。 这是一个字符串的迷你示例:
{"daily":{"1337990400000":443447,"1338076800000":444693,"1338163200000":452282,"1338249600000":462189,"1338336000000":466626}
对于我的应用程序中的另一个JSON字符串,我使用的是JavascriptSerializer并使用类结构预测密钥。 将此字符串反序列化为对象的最佳方法是什么?
说真的,没有必要沿着动态的路线走下去; 使用
var deser = new JavaScriptSerializer() .Deserialize>>(val); var justDaily = deser["daily"];
得到一本字典,然后你就可以了
foreach (string key in justDaily.Keys) Console.WriteLine(key + ": " + justDaily[key]);
获取密钥和相应的值。
您可以在.NET 4或更高版本中使用dynamic
。 例如,使用JSON.NET,我可以这样做:
dynamic obj = JsonConvert.Deserialize("{x: 'hello'}");
然后你可以这样做:
var str = obj.x;
但是,不确定它将如何处理数字键。 你当然可以直接使用JObject
,例如:
var obj = JObject.Parse("{'123456': 'help'}"); var str = obj["123456"];
这样使用起来不方便,因为在с#中无法定义变量以数字开头。 为密钥添加前缀。
或试试这个:
string json = " { daily:[ { key: '1337990400000', val:443447 }, { key: '1338076800000', val:444693 }, { key: '1338163200000', val:452282 }, { key: '1338249600000', val:462189 }, { key: '1338336000000', val:466626 }] }"; public class itemClass { public string key; // or int public int val; } public class items { public itemClass[] daily; } items daily = (new JavascriptSerializer()).Deserialize(json);
然后你可以:
var itemValue = items.Where(x=>x.key=='1338163200000').Select(x=>x.val).FirstOrDefault();
- 与generics参数的接口与使用generics方法的接口
- IronRuby在.NET 3.5中调用C#扩展方法 – 错误 – 兼容性
- C#:反序列化XML文件错误(认为这是一个命名空间问题 – 但是我的生活不能解决它)
- ‘Compare’是’System.ComponentModel.DataAnnotations.CompareAttribute’和’System.Web.Mvc.CompareAttribute’之间的模糊引用。
- 在.NET上使用RSA私钥签名字符串?
- 密钥列具有不同名称时实体拆分?
- 在Web.API控制器中自动反序列化为类似字符串的类
- ASP.NET站点 – 在特定时间触发一些代码
- 在ASP.NET Core 2中dependency injection相同类型的多个实例