Записать словарь в файл JSON

#c# #json #.net #json.net

#c# #json #.net #json.net

Вопрос:

Если у меня есть Dictionary<string, dynamic> , где ключи используют точечную нотацию, есть ли простой способ преобразовать в JSON с помощью JSON.NET ? Например:

 Dictionary<string, dynamic> records = new Dictionary<string, dynamic>
{
    { "Name.First", "John" },
    { "Name.Last", "Doe" },
    { "ContactInfo", new ContactInfo {
        Phone = "555-555-5555",
        Foo = 999,
        Bar = true
    } }
};
  

Желаемый JSON будет:

 {
    "name": {
        "first": "John",
        "last": "Doe"
    },
    "contactInfo": {
        "phone": "555-555-5555",
        "foo": 999,
        "bar": true
    }
}
  

Комментарии:

1. Кажется подозрительным, что вы храните такого рода информацию в словаре (именно таким образом). Также каждый раз, когда вы думаете об использовании dynamic типа, говорите себе, что всегда есть лучший способ

2. Для этого можно использовать пользовательский JsonConverter

Ответ №1:

Итак, есть много способов сделать это. Однако основной проблемой является выбор дизайна словаря со dynamic значениями, без дальнейших объяснений это кажется очень подозрительным.

Однако, предполагая, что вы знаете лучше. Вам придется спроецировать свои данные в другую форму или написать какой-нибудь конвертер так или иначе. Я выбрал анонимный тип, поскольку ваши данные относительно просты.

 var temp = new
{
   name = new
   {
      first = records["Name.First"],
      last = records["Name.Last"],
   },
   ContactInfo = records["ContactInfo"]
};

// this is just one way to get your `ContactInfo` camel case, there are others
var contractResolver = new DefaultContractResolver
{
   NamingStrategy = new CamelCaseNamingStrategy()
};

var json = JsonConvert.SerializeObject(temp, new JsonSerializerSettings()
{
   ContractResolver = contractResolver,
   Formatting = Formatting.Indented
});


Console.WriteLine(json); 
  

Вывод

 {
  "name": {
    "first": "John",
    "last": "Doe"
  },
  "contactInfo": {
    "phone": "555-555-5555",
    "foo": 999,
    "bar": true
  }
}
  

Примечание: этот ответ не является оптимальным, я бы рассмотрел возможность переоценки вашего выбора структуры данных

Комментарии:

1. Отметив это как ответ, потому что это заставило меня переосмыслить проблему. Как вы и предлагали, работа с другой структурой данных с использованием JObjects amp; JArrays привела меня туда, где мне нужно было быть. Хороший совет!

Ответ №2:

Используйте JsonSerializer . Сначала вам нужно его импортировать

 using Newtonsoft.Json;
  

Затем используйте следующий код, чтобы получить строку JSON

 String json = JsonConvert.SerializeObject(records);
  

Комментарии:

1. Это не приведет к желаемому результату