Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中从JSON检索Mixpanel数据#_C#_.net_Json - Fatal编程技术网

C# 在C中从JSON检索Mixpanel数据#

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}

我正在尝试从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; }
}
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#类,然后将其反序列化为相应的对象

  • 通过课堂:
  • 要创建json类,有一个网站,它会创建json所需的类(也嵌套):

    然后使用:

    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#中,变量不能以数字开头。有很多方法可以解决这个问题,我会仔细阅读并编辑答案。非常感谢你花时间和解释,这真的帮助了我。