C# 在C中从JSON检索Mixpanel数据#
我正在尝试从Mixpanel API获取数据。JSON结果如下所示:C# 在C中从JSON检索Mixpanel数据#,c#,.net,json,C#,.net,Json,我正在尝试从Mixpanel API获取数据。JSON结果如下所示: {"computed_at": "2019-11-19T10:36:33.908802+00:00", "legend_size": 1, "data": {"series": ["2019-11-11", "2019-11-12", "2019-11-13"], "values": {"page views": {"2019-11-12": 111, "2019-11-11": 573, "2019-11-13": 209}
{"computed_at": "2019-11-19T10:36:33.908802+00:00", "legend_size": 1, "data": {"series": ["2019-11-11", "2019-11-12", "2019-11-13"], "values": {"page views": {"2019-11-12": 111, "2019-11-11": 573, "2019-11-13": 209}}}}
我正在努力使用嵌套JSON(尽管在这方面看了不少StackOverflow文章),我想尝试获取页面视图的值111
、573
和209
。如何访问这些值
我尝试了以下方法:
var result = {"computed_at": "2019-11-19T10:36:33.908802+00:00", "legend_size": 1, "data": {"series": ["2019-11-11", "2019-11-12", "2019-11-13"], "values": {"page views": {"2019-11-12": 111, "2019-11-11": 573, "2019-11-13": 209}}}}
var rawData = result["data"]["values"]["page views"][0]
但这不起作用,我也不知道如何访问各个值。有人能帮忙吗
编辑:
当使用json到C#转换器时(如本文评论中所建议的),结果如下:
public class PageViews
{
public int __invalid_name__2019-11-20 { get; set; }
public int __invalid_name__2019-11-19 { get; set; }
}
public class Values
{
public PageViews __invalid_name__page views { get; set; }
}
public class Data
{
public List<string> series { get; set; }
public Values values { get; set; }
}
public class RootObject
{
public DateTime computed_at { get; set; }
public int legend_size { get; set; }
public Data data { get; set; }
}
var pageViews = [];
for (var key of Object.keys(result.data.values['page views'])) {
pageViews.push(result.data.values['page views'][key]);
}
公共类页面浏览量
{
公共整数无效的名称2019-11-20{get;set;}
公共整数uuu无效名称uuu 2019-11-19{get;set;}
}
公共阶级价值观
{
公共网页浏览量uu无效u名称uu网页浏览量{get;set;}
}
公共类数据
{
公共列表系列{get;set;}
公共值值{get;set;}
}
公共类根对象
{
在{get;set;}处计算的公共日期时间
公共整数图例大小{get;set;}
公共数据数据{get;set;}
}
我仍然不确定如何从中获取数据 您可以采取两种方法。首先,我将使用反序列化json字符串 然后,您可以使用作业对象遍历json,或者创建一个表示json数据的C#类,然后将其反序列化为相应的对象
var myObject = JsonConvert.DeserializeObject<MyClass>(jsonString);
编辑:
由于Json包含以数字开头的键(并且不是有效的c#变量名),所以这有点棘手,但可行。自动转换器在此服务器上失败
string json = "{\"computed_at\": \"2019 - 11 - 19T10: 36:33.908802 + 00:00\", \"legend_size\": 1, \"data\": {\"series\": [\"2019 - 11 - 11\", \"2019 - 11 - 12\", \"2019 - 11 - 13\"], \"values\": {\"page views\": {\"2019 - 11 - 12\": 111, \"2019 - 11 - 11\": 573, \"2019 - 11 - 13\": 209}}}}";
var myObject = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var view in myObject.data.series)
{
int number = myObject.data.values.page_views[view];
Console.WriteLine($"{number} views on {view}");
}
诀窍是对日期值使用字典
类型,并将属性重命名为有效的c#名称。JsonDeserializer仍然可以找到数据,因为我们告诉它使用JsonProperty
属性查找“页面视图”。这样,该类还可以灵活地处理“页面视图”字段中的多个条目
希望这对你有所帮助你很接近。排队
var rawData=result[“data”][“values”][“page views”][0]
您正试图访问对象的索引0。这并没有真正意义,因为对象基本上是字典或哈希表,这意味着它们是无序的,必须通过键而不是索引来访问(请参阅)
你想要的看起来像
var rawData=result[“data”][“values”][“page views”][2019-11-12']
访问日期2019-11-12
的页面视图数(即111
)
然后,您可以通过对象进行循环,并按如下方式获得每个页面视图数:
public class PageViews
{
public int __invalid_name__2019-11-20 { get; set; }
public int __invalid_name__2019-11-19 { get; set; }
}
public class Values
{
public PageViews __invalid_name__page views { get; set; }
}
public class Data
{
public List<string> series { get; set; }
public Values values { get; set; }
}
public class RootObject
{
public DateTime computed_at { get; set; }
public int legend_size { get; set; }
public Data data { get; set; }
}
var pageViews = [];
for (var key of Object.keys(result.data.values['page views'])) {
pageViews.push(result.data.values['page views'][key]);
}
非常感谢@luchpeter这真的很有用。我想沿着第一条路线,创建一个C#类,并将其反序列化为相应的对象。然而,转换转换成许多类,我仍然不知道如何从中访问这些数字?我已经编辑了我的原始问题,显示了这个。好的,我来看看。原因是,json包含的参数名不是有效的c#变量名。在c#中,变量不能以数字开头。有很多方法可以解决这个问题,我会仔细阅读并编辑答案。非常感谢你花时间和解释,这真的帮助了我。