簡體   English   中英

從 C# 中的 JSON 檢索 Mixpanel 數據

[英]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 文章),我想嘗試獲取頁面視圖的值111573209 如何訪問這些值?

我嘗試了以下方法:

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.

  1. 通過 class:

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 。

  1. 通過 JObject

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM