为 KairosDB api 创建 Json
Create Json for KairosDB api
我想用 post 方法向 KairosDB 发送数据,但我的 Json 不正确。 Json 必须是这样的:
{
"name":"Hermle_1",
"datapoints":[
[
"1530710258000",
23.0
],
[
"1530710257000",
21.0
]
],
"tags":{
"SensorName":"capteur_temperature"
}
}
对于数据点,我将 Dictionary<string, float>
添加到我的对象中。当我序列化它时我有什么:
{
"name":"Hermle_1",
"datapoints":{
"1530710258000":23.0,
"1530710257000":21.0
},
"tags":{
"SensorName":"capteur_temperature"
}
}
如果我更改字典 .ToArray()
我有这个 Json:
{
"name":"Hermle_1",
"datapoints":[
{
"Key":"1530710258000",
"Value":23.0
},
{
"Key":"1530710257000",
"Value":21.0
}
],
"tags":{
"SensorName":"capteur_temperature"
}
}
我不知道如何以数据点的预期格式生成 json。
编辑:
我如何创建对象:
dynamic jsonObj = new ExpandoObject();
jsonObj.name = sd.Engine_name;
Dictionary<string, float> datapoints = new Dictionary<string, float>();
Dictionary<string, string> tags = new Dictionary<string, string>();
tags.Add("SensorName", sensor.Name);
//.........
while (reader.Read())
{
datapoints.Add(Convert.ToString(reader["time"]),
Convert.ToSingle(reader["value"]));
}
//....
jsonObj.datapoints = datapoints;
jsonObj.tags = tags;
string a = JsonConvert.SerializeObject(jsonObj, Formatting.Indented);
正如我在上面的评论中所说,datapoints
不是 Dictionary
而是 List<List<object>>
它必须是 object
因为你必须把 string
和 float
到同一个列表中。
List<List<object>> datapoints = new List<List<object>>();
while (reader.Read()) {
datapoints.Add(new List<object>{
Convert.ToString(reader["time"]),
Convert.ToSingle(reader["value"])
});
}
如果您不确定如何将 json 字符串转换为 class 结构,请查看这个有用的 tool。使用可以填充 json 数据的 class 结构的优点是,您不需要使用任何动态变量来序列化或反序列化 json 对象。
生成的 C# 代码如下所示:
public class Tags
{
public string SensorName { get; set; }
}
public class RootObject
{
public string Name { get; set; }
public List<List<object>> Datapoints { get; set; }
public Tags Tags { get; set; }
}
查看生成的代码后,您会发现哪里出错了。数据点的 json 使用列表 List()
而不是 Dictionary<string, float>
.
现在使用它来生成您的 json 数据非常简单:
var root = new RootObject();
root.Name = sd.Engine_name;
root.Tags = new List
{
new Tags {SensorName = sensor.Name}
};
var datapoints = new List<List<object>>();
while (reader.Read())
{
datapoints.Add(new List<object>{
Convert.ToString(reader["time"]),
Convert.ToSingle(reader["value"])
});
}
root.Datapoints = datapoints;
var json = JsonConvert.SerializeObject(root, Formatting.Indented);
我想用 post 方法向 KairosDB 发送数据,但我的 Json 不正确。 Json 必须是这样的:
{
"name":"Hermle_1",
"datapoints":[
[
"1530710258000",
23.0
],
[
"1530710257000",
21.0
]
],
"tags":{
"SensorName":"capteur_temperature"
}
}
对于数据点,我将 Dictionary<string, float>
添加到我的对象中。当我序列化它时我有什么:
{
"name":"Hermle_1",
"datapoints":{
"1530710258000":23.0,
"1530710257000":21.0
},
"tags":{
"SensorName":"capteur_temperature"
}
}
如果我更改字典 .ToArray()
我有这个 Json:
{
"name":"Hermle_1",
"datapoints":[
{
"Key":"1530710258000",
"Value":23.0
},
{
"Key":"1530710257000",
"Value":21.0
}
],
"tags":{
"SensorName":"capteur_temperature"
}
}
我不知道如何以数据点的预期格式生成 json。
编辑: 我如何创建对象:
dynamic jsonObj = new ExpandoObject();
jsonObj.name = sd.Engine_name;
Dictionary<string, float> datapoints = new Dictionary<string, float>();
Dictionary<string, string> tags = new Dictionary<string, string>();
tags.Add("SensorName", sensor.Name);
//.........
while (reader.Read())
{
datapoints.Add(Convert.ToString(reader["time"]),
Convert.ToSingle(reader["value"]));
}
//....
jsonObj.datapoints = datapoints;
jsonObj.tags = tags;
string a = JsonConvert.SerializeObject(jsonObj, Formatting.Indented);
正如我在上面的评论中所说,datapoints
不是 Dictionary
而是 List<List<object>>
它必须是 object
因为你必须把 string
和 float
到同一个列表中。
List<List<object>> datapoints = new List<List<object>>();
while (reader.Read()) {
datapoints.Add(new List<object>{
Convert.ToString(reader["time"]),
Convert.ToSingle(reader["value"])
});
}
如果您不确定如何将 json 字符串转换为 class 结构,请查看这个有用的 tool。使用可以填充 json 数据的 class 结构的优点是,您不需要使用任何动态变量来序列化或反序列化 json 对象。
生成的 C# 代码如下所示:
public class Tags
{
public string SensorName { get; set; }
}
public class RootObject
{
public string Name { get; set; }
public List<List<object>> Datapoints { get; set; }
public Tags Tags { get; set; }
}
查看生成的代码后,您会发现哪里出错了。数据点的 json 使用列表 List()
而不是 Dictionary<string, float>
.
现在使用它来生成您的 json 数据非常简单:
var root = new RootObject();
root.Name = sd.Engine_name;
root.Tags = new List
{
new Tags {SensorName = sensor.Name}
};
var datapoints = new List<List<object>>();
while (reader.Read())
{
datapoints.Add(new List<object>{
Convert.ToString(reader["time"]),
Convert.ToSingle(reader["value"])
});
}
root.Datapoints = datapoints;
var json = JsonConvert.SerializeObject(root, Formatting.Indented);