【问题标题】:Create Json for KairosDB api为 KairosDB api 创建 Json
【发布时间】:2018-12-13 15:57:45
【问题描述】:

我想用 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 应该是数组数组,或者如果您愿意,可以是列表列表。不是字典

标签: c# json.net kairosdb


【解决方案1】:

正如我在上面的评论中所说,datapoints 不是Dictionary,而是List&lt;List&lt;object&gt;&gt;,它必须是object,因为您必须将stringfloat 放在同一个列表中。

List<List<object>> datapoints = new List<List<object>>();
while (reader.Read()) {
    datapoints.Add(new List<object>{
        Convert.ToString(reader["time"]), 
        Convert.ToSingle(reader["value"])
    });
}

【讨论】:

  • 感谢列表> 是我正在寻找的。完美运行!
【解决方案2】:

如果您不确定如何将 json 字符串转换为类结构,请查看此有用的 tool。使用可以填充 json 数据的类结构的优点是,您不需要使用任何动态变量来序列化或反序列化 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&lt;string, float&gt;


现在使用它来生成您的 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);

【讨论】:

  • 感谢您的工具。很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2022-01-23
  • 2015-04-22
  • 2016-06-12
相关资源
最近更新 更多