[英]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.