求助!!这是源码 ,从云端api获取动态的json数据,如何一层一层解析提取我想要的value值和at的时间值,求各路大神帮忙!

小白xqr 2019-07-29 05:19:26

private void button2_Click(object sender, EventArgs e)
{
//创建一个请求示例
//HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://api.heclouds.com/devices/datapoints?devIds=527240946");
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://api.heclouds.com/devices/datapoints?devIds=527240946");
//添加头(设置api-key)
request.Headers["api-key"] = "OguztSiBglhJiDO=49nPj3R1miE=";

//获取响应,即发送请求
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
//读取响应
string str = streamReader.ReadToEnd();

dynamic obj = JsonConvert.DeserializeObject<dynamic>(str);
string result1 = ((JObject)obj["data"])["devices"].ToString();
MessageBox.Show(result1);//这句话是输出最后获取的结果
}


求助!!这是源码 ,从云端api获取动态的json数据,可自行创建工程运行,如何一层一层解析提取我想要的value值和at的时间值,求各路大神帮忙!
...全文
1904 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36798319 2019-08-01
  • 打赏
  • 举报
回复
学习学习!!
小白xqr 2019-08-01
  • 打赏
  • 举报
回复
引用 19 楼 沫含天下的回复:
同样内容的帖子楼主一共提了3遍
重在虚心请教 孜孜不倦 只有问多了才能彻底弄明白,学无止境,而且内容也是有差异的,这位大佬一定混迹论坛多年,这种小白的帖子大佬还是不要看的好,以免气大伤身啊!
沫含天下 2019-08-01
  • 打赏
  • 举报
回复
同样内容的帖子楼主一共提了3遍
小白xqr 2019-08-01
  • 打赏
  • 举报
回复
引用 21 楼 凉晨(已开双封)的回复:
各位在座的都是大佬,佩服佩服
是啊 大佬太多了啊 顶不住
XBodhi. 2019-08-01
  • 打赏
  • 举报
回复
你自己放到字典里。然后动态更新就可以了。
  • 打赏
  • 举报
回复
各位在座的都是大佬,佩服佩服
沫含天下 2019-07-31
  • 打赏
  • 举报
回复
LogHelper log = LogHelper.GetInstance();
try
{
string jsons = "{\"devices\":[{\"title\":\"监控终端\",\"id\":\"527240946\",\"datastreams\":[{\"at\":\"2019-07-19 23:24:01\",\"id\":\"3200_0_5500\",\"value\":true},{\"at\":\"2019-07-19 23:23:48\",\"id\":\"3315_0_5700\",\"value\":120000},{\"at\":\"2019-07-19 23:23:36\",\"id\":\"3303_0_5700\",\"value\":49},{\"at\":\"2019-07-19 23:23:42\",\"id\":\"3325_0_5700\",\"value\":0},{\"at\":\"2019-07-19 23:23:53\",\"id\":\"3304_0_5700\",\"value\":5}]}]}";
JObject rss = JObject.Parse(jsons);

JArray datastreams = (JArray)rss["devices"][0]["datastreams"];
foreach (var Item in datastreams) {
log.WriteInfoLog("at:" + Item["at"].ToString());
log.WriteInfoLog("id:" + Item["id"].ToString());
log.WriteInfoLog("value:" + Item["value"].ToString());
}


IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
string json = JsonConvert.SerializeObject("nice", Newtonsoft.Json.Formatting.Indented, timeFormat);
context.Response.Write(json);
context.Response.End();
}
catch (Exception ex){}

小白xqr 2019-07-31
  • 打赏
  • 举报
回复
首先表达我十二万分的感谢,是这样,是我阐述的还不够清楚,上面这些在大佬的帮助下已经渐渐有点门道了,我真正想问的是这个

foreach (var datastream in device.Datastreams)
{
textBox3.Text=($"{datastream.At}");
textBox2.Text= ($"{datastream.Value}");
richTextBox1.AppendText($"{datastream.At} {datastream.Value}");
}
可以把每个值拆开来用,而不是成块的数据,就是value值是可以选择被显示的,比如那个是1,被刷新掉就只显示最后一个value
XBodhi. 2019-07-31
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/392989729

这个也是你的吧
XBodhi. 2019-07-31
  • 打赏
  • 举报
回复

算了给你全给你写了吧

输出结果

id=>527240946 title=>监控终端
-----------------------------------------------------------
id=>3315_0_5700 At=>2019-07-28 17:58:28 Value=>100322
id=>3325_0_5700 At=>2019-07-28 17:58:31 Value=>1
id=>3303_0_5700 At=>2019-07-28 17:56:17 Value=>29.8
id=>3304_0_5700 At=>2019-07-28 17:58:28 Value=>536876872
id=>3200_0_5500 At=>2019-07-28 17:56:20 Value=>False
请按任意键继续. . .



源代码。在你基础上改的


using Newtonsoft.Json;
using System;
using System.IO;
using System.Net;
using System.Text;

namespace ConsoleApp2
{
/*
{
"errno": 0,
"data": {
"devices": [
{
"title": "监控终端",
"id": "527240946",
"datastreams": [
{
"at": "2019-07-28 17:58:31",
"id": "3325_0_5700",
"value": 1
},
{
"at": "2019-07-28 17:56:17",
"id": "3303_0_5700",
"value": 29.8
},
{
"at": "2019-07-28 17:58:28",
"id": "3315_0_5700",
"value": 100322
},
{
"at": "2019-07-28 17:56:20",
"id": "3200_0_5500",
"value": false
},
{
"at": "2019-07-28 17:58:28",
"id": "3304_0_5700",
"value": 5.36876872E8
}
]
}
]
},
"error": "succ"
}
*/


public class ErrorInfo
{
public int Errno { get; set; }
public ErrorInfoData Data { get; set; }
public string Error { get; set; }
}

public class ErrorInfoData
{
public int Count { get; set; }
public Device[] Devices { get; set; }
}

public class Device
{
public string Id { get; set; }
public string Title { get; set; }
public Datastream[] Datastreams { get; set; }
}

public class Datastream
{
public string Id { get; set; }
public string At { get; set; }
public dynamic Value { get; set; }
}

class Program
{
static void Main(string[] args)
{
//创建一个请求示例
//HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://api.heclouds.com/devices/datapoints?devIds=527240946");
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://api.heclouds.com/devices/datapoints?devIds=527240946");
//添加头(设置api-key)
request.Headers["api-key"] = "OguztSiBglhJiDO=49nPj3R1miE=";

//获取响应,即发送请求
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
//读取响应
string str = streamReader.ReadToEnd();

ErrorInfo errorInfo = JsonConvert.DeserializeObject<ErrorInfo>(str);

foreach (var device in errorInfo.Data.Devices)
{
Console.WriteLine($"id=>{device.Id} title=>{device.Title}");
Console.WriteLine("-----------------------------------------------------------");
foreach (var datastream in device.Datastreams)
{
Console.WriteLine($"id=>{datastream.Id} At=>{datastream.At} Value=>{datastream.Value}");
}
}
}
}
}



小白xqr 2019-07-31
  • 打赏
  • 举报
回复
我那篇也回复你了 有新问题 你看一下 大哥
XBodhi. 2019-07-31
  • 打赏
  • 举报
回复
兄弟,你上个帖子不是给你写了吗。

连实体类都给你写好了。

你还差那部分。
qq_小单车 2019-07-31
  • 打赏
  • 举报
回复
很好的内容,参考下
小白xqr 2019-07-30
  • 打赏
  • 举报
回复

string t1 = string.Format("{0}", end["at"]);
MessageBox.Show(t1);

这是以上代码执行的结果 我只有用MessageBox.Show的方法才能完整显示出数组里的值,用文本框显示就只有第一个值,这应该怎么解决呢

小白xqr 2019-07-30
  • 打赏
  • 举报
回复
引用 9 楼 sinomac的回复:
解决就好,另一个贴子也好多朋友关注哦。
是啊 朋友知道string.format("{0}",end["value"];)之后怎么把指定后面的值拿出来吗 这样只有第一个值会显示出来 除非用messagebox.show才会把所有值一个个弹出来
sinomac 2019-07-29
  • 打赏
  • 举报
回复
解决就好,另一个贴子也好多朋友关注哦。
小白xqr 2019-07-29
  • 打赏
  • 举报
回复
引用 6 楼 娃都会打酱油了的回复:
该赋值就赋值,如果要组织成一起,也应该string.Format……
解决了!!新手小白多谢了!
小白xqr 2019-07-29
  • 打赏
  • 举报
回复
引用 6 楼 娃都会打酱油了的回复:
该赋值就赋值,如果要组织成一起,也应该string.Format……
啥叫该赋值就赋值啊具体实现代码怎么写啊
  • 打赏
  • 举报
回复
该赋值就赋值,如果要组织成一起,也应该string.Format……
小白xqr 2019-07-29
  • 打赏
  • 举报
回复
哇 很棒 解决了我的核心问题 不过还有一个问题是 严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS1503 参数 1: 无法从“(string, Newtonsoft.Json.Linq.JToken, Newtonsoft.Json.Linq.JToken)”转换为“string” ConsoleApp1 C:\Users\xqr\source\repos\ConsoleApp1\ConsoleApp1\Form1.cs 48 活动的

怎么样把这些数据显示到winform窗体中的控件里面去呢
加载更多回复(4)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧