Создать Json для KairosDB API - PullRequest
0 голосов
/ 05 июля 2018

Я хочу отправить данные в KairosDB методом post, но мой 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);

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если вы не уверены, как преобразовать строку json в конструкцию класса, взгляните на этот полезный инструмент . Преимущество использования структуры классов, в которой вы можете заполнять свои данные 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<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);
0 голосов
/ 05 июля 2018

Как я уже сказал в моем комментарии выше, 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"])
    });
}
...