[英]Retrieving Mixpanel data from JSON in C#
我正在尝试从 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}}}}
我正在为嵌套的 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; }
}
我仍然不确定如何从中获得数字?
您可以采取两种方法。 首先,我将使用这个库 - Newtonsoft反序列化 json 字符串。
You can then go through the json using JObjects, or you can create a C#-Class that represents your json data and then deserialize it into a corresponding object.
To create the json class there is this website, which creates the classes (also nested) just as the json needs them to be: http://json2csharp.com/
然后你使用:
var myObject = JsonConvert.DeserializeObject<MyClass>(jsonString);
然后通过您的 object 属性简单地 go 。
JObjects 允许您轻松搜索 json 字符串,如下所示:
JObject myObject = JObject.Parse(json);
var results = myObject["data"]["values"]["page views"].First();
编辑:由于您的 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}");
}
RootObject
class 为:
public class Values
{
[JsonProperty("page views")]
public Dictionary<string, int> page_views { get; set; }
}
public class Data
{
public List<string> series { get; set; }
public Values values { get; set; }
}
public class RootObject
{
public string computed_at { get; set; }
public int legend_size { get; set; }
public Data data { get; set; }
}
诀窍是对日期值使用Dictionary<string, int>
类型,并将属性重命名为有效的 c# 名称。 JsonDeserializer 仍然可以找到数据,因为我们告诉它使用JsonProperty
属性查找“页面浏览量”。 这样,class 也可以灵活地用于“页面浏览”字段中的多个条目。
希望这可以帮助
你很亲密。 在行
var rawData = result["data"]["values"]["page views"][0]
您正在尝试访问 object 的索引 0。 这实际上没有任何意义,因为对象基本上是字典或 hash 表,这意味着它们是无序的,必须通过键而不是索引来访问(请参阅检索 JSON ZA8CFDE63311BD59EB2AC96F8 的属性)。
你想要的样子
var rawData = result["data"]["values"]["page views"]['2019-11-12']
访问2019-11-12
日期的页面浏览量(即111
)。
然后您可以遍历 object 并获取每个页面浏览量,如下所示:
var pageViews = [];
for (var key of Object.keys(result.data.values['page views'])) {
pageViews.push(result.data.values['page views'][key]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.