Сериализация файла JSON в класс и словарь - PullRequest
0 голосов
/ 11 октября 2018

Моя структура класса является фиксированной, но переменные объекта (свойства) не являются фиксированными.Эти данные настраиваются.Я создаю класс со словарем, но он не работает.

Например,

{
"datamapItems": [
      {
        "paramName": "VE8321C",
        "datamapKey": {
          "module": 1,
          "id": 1391
        },
        "min": "0",
        "max": "40",
        "default": 222,
        "rateHz": 0,
        "timeoutMs": 0,
        "dataType": "uint16"
      }
   ]
}

Для этой структуры JSON мы создали следующую структуру классов.Но это не работает.После сериализации словарь не содержит никаких значений.

public class Datamap
{
    [JsonProperty("datamapItems")]
    public List<DatamapItem> datamapItems { get; set; }
}

public class DatamapItem
{
    public Dictionary<object, object> datamapitems = new Dictionary<object, object>();
    public DatamapKey datamapKey { get; set; }
}
public class DatamapKey
{
    public Dictionary<object, object> datamapitems = new Dictionary<object, object>();
}

1 Ответ

0 голосов
/ 11 октября 2018

Если ваши объекты не являются фиксированными, и данные должны быть конфигурируемыми, тогда Newtonsoft.json имеет одну особенность, которая будет использоваться здесь, и это [JsonExtensionData]. Подробнее

Данные расширения теперь записываются при сериализации объекта.Чтение и запись данных расширения позволяет автоматически выполнять обход всех JSON без добавления каждого свойства к типу .NET, к которому вы десериализуетесь.Объявите только те свойства, которые вас интересуют, и пусть данные расширений сделают все остальное.

Здесь я создал консольное приложение для демонстрационных целей.

class Program
{
    static void Main(string[] args)
    {
        //This is your input json string
        var inputJson = @"{
                      'datamapItems': [
                                   {
                                      'paramName': 'VE8321C',
                                      'datamapKey': {
                                                   'module': 1,
                                                   'id': 1391
                                      },
                                      'min': '0',
                                      'max': '40',
                                      'default': 222,
                                      'rateHz': 0,
                                      'timeoutMs': 0,
                                      'dataType': 'uint16'
                                    }
                                 ]
                           }";


        var result = JsonConvert.DeserializeObject<Datamap>(inputJson);  //Here you can deserialize your json


        DatamapKey datamapKey = new DatamapKey();
        datamapKey._DatamapKeys = new Dictionary<string, JToken>();
        datamapKey._DatamapKeys.Add("module", 1);
        datamapKey._DatamapKeys.Add("id", 1391);
        datamapKey._DatamapKeys.Add("ABC", 123);   //Here I added extra key/value pair to your inner object

        DatamapItem datamapItem = new DatamapItem();
        datamapItem._DatamapItems = new Dictionary<string, JToken>();
        datamapItem._DatamapItems.Add("paramName", "VE8321C");
        datamapItem._DatamapItems.Add("datamapKey", JToken.FromObject(datamapKey));
        datamapItem._DatamapItems.Add("min", "0");
        datamapItem._DatamapItems.Add("max", "40");
        datamapItem._DatamapItems.Add("default", 222);
        datamapItem._DatamapItems.Add("rateHz", 0);
        datamapItem._DatamapItems.Add("timeoutMs", 0);
        datamapItem._DatamapItems.Add("dataType", "uint16");

        datamapItem._DatamapItems.Add("PQR", "123");   //Here I added extra key/value pair to your outer object
        datamapItem._DatamapItems.Add("XYZ", "123");    //Here I added extra key/value pair to your outer object

        Datamap datamap = new Datamap();
        datamap.datamapItems = new List<DatamapItem>();
        datamap.datamapItems.Add(datamapItem);

        string json = JsonConvert.SerializeObject(datamap);   //Here you can serialize your custom key/value pair 

        JObject parsed = JObject.Parse(json);
        Console.WriteLine(parsed);

        Console.ReadLine();
    }
}

public class DatamapKey
{
    [JsonExtensionData]
    public IDictionary<string, JToken> _DatamapKeys;
}

public class DatamapItem
{
    [JsonExtensionData]
    public IDictionary<string, JToken> _DatamapItems;
}

public class Datamap
{
    public List<DatamapItem> datamapItems { get; set; }
}

Вывод:

enter image description here

Редактировать:

1) Для ниже json

{ "agentRegistry": { "agents": [ { "type": "drv", "id": "drv3", "port": 3, "config": { "mode": "currentSetPoint", "config": { } } }, { "type": "mmc", "id": "mmc2", "port": 2, "config": { "mode": "analogIn", "config": { "max": 21000, "min": 300, "conversion": [ ] } }}]}}

Классы:

public class Config2
{
    [JsonExtensionData]
    public IDictionary<string, JToken> _config2;
}

public class Config
{
    [JsonExtensionData]
    public IDictionary<string, JToken> _config;
}

public class Agent
{
    [JsonExtensionData]
    public IDictionary<string, JToken> _agents;
}

public class AgentRegistry
{
    public List<Agent> agents { get; set; }
}

public class RootObj
{
    public AgentRegistry agentRegistry { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...