【问题标题】:Retrieving Mixpanel data from JSON in C#在 C# 中从 JSON 中检索 Mixpanel 数据
【发布时间】:2019-11-21 02:10:08
【问题描述】:

我正在尝试从 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# 转换器时(如本文的 cmets 中所建议),结果如下:

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; }
}

我仍然不确定如何从中获取数字?

【问题讨论】:

    标签: c# .net json


    【解决方案1】:

    您可以采取两种方法。首先,我将使用 this library - Newtonsoft 反序列化 json 字符串。

    然后您可以使用 JObjects 遍历 json,或者您可以创建一个代表您的 json 数据的 C#-Class,然后将其反序列化为相应的对象。

    1. 通过类:

    要创建 json 类,有这个网站,它创建类(也是嵌套的),就像 json 需要它们一样:http://json2csharp.com/

    然后你使用:

    var myObject = JsonConvert.DeserializeObject<MyClass>(jsonString);
    

    然后简单地检查您的对象属性。

    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 类为:

     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&lt;string, int&gt; 类型作为日期值,并将属性重命名为有效的 c# 名称。 JsonDeserializer 仍然可以找到数据,因为我们告诉它使用 JsonProperty 属性查找“页面浏览量”。这样,该类还可以灵活地用于“页面浏览量”字段中的多个条目。

    希望对你有帮助

    【讨论】:

    • 非常感谢@Luchspeter,这真的很有用。我想沿着第一条路线创建一个 C# 类并将其反序列化为相应的对象。但是,转换转换为很多类,我仍然不确定如何从中访问数字?我已经编辑了显示这个的原始问题。
    • 好的,我去看看。原因是,您的 json 包含参数名称,它们不是有效的 c# 变量名称。在 c# 中,变量不能以数字开头。有一些方法可以解决这个问题,我将通过它们并编辑答案
    • 非常感谢您的时间和解释 - 这真的帮助了我。
    【解决方案2】:

    你很亲密。在行中

    var rawData = result["data"]["values"]["page views"][0]

    您正在尝试访问对象的索引 0。这实际上没有任何意义,因为对象基本上是字典或哈希表,这意味着它们是无序的,并且必须通过键而不是索引来访问(参见 Retrieving a property of a JSON object by index?)。

    你想要的样子

    var rawData = result["data"]["values"]["page views"]['2019-11-12'] 访问日期2019-11-12 的页面浏览量(即111)。

    然后您可以遍历该对象并获取每个页面浏览量,如下所示:

    var pageViews = [];
    for (var key of Object.keys(result.data.values['page views'])) {
        pageViews.push(result.data.values['page views'][key]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多