Вам не нужно конвертировать их при добавлении в словарь.Что вы хотите сделать, так это заполнить словарь, как вы всегда (с помощью селектора ключа и значения), а затем перед сериализацией измените его на список типов, который затем определяет, как он будет сериализован.
Попробуйте:
[Obsolete]
public string POB_CODE()
{
Dictionary<string, string> _dicts = null;
try
{
using (OracleConnection Oconn = new OracleConnection(connectionORI))
{
_dicts = Oconn.Query<KeyValuePair<string, string>>(
"SELECT " +
"POB_CODE AS Key," +
"POB_DESC AS Value " +
"FROM " +
"POB_CODE " +
"WHERE " +
"DISPLAY_SORT_ORDER >=1 " +
"AND " +
"DISPLAY_SORT_ORDER <=60",
null
)
.ToDictionary(p => p.Key, p => p.Value);
}
}
catch (SqlException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
jsonOutputStyle[] styledDictionary = _dicts.Select(p => new jsonOutputStyle() { Name = p.Key, Value = p.Value }).ToArray();
return JsonConvert.SerializeObject(styledDictionary, Formatting.None);
}
Разбивка важных изменений:
.ToDictionary(p => p.Key, p => p.Value);
вместо
.ToDictionary(pair => new jsonOutputStyle() {
Name = pair.Key,
Value = pair.Value
});
Здесь мы сначаланужно получить простой словарь с string
в качестве ключа и string
в качестве значения.Мы делаем это с помощью двух селекторов.Один для ключа (p => p.Key
) и один для значения (p => p.Value
).Нам пока не нужно беспокоиться о сериализации.
Теперь для сериализации мы не напрямую сериализуем словарь, а вместо этого приводим словарь к массиву вашего типа tupel.Это позволяет нам сериализовать имена you , определенные в этом классе, а не предварительно определенные имена свойств.
jsonOutputStyle[] styledDictionary = _dicts.Select(p => new jsonOutputStyle() { Name = p.Key, Value = p.Value }).ToArray();
return JsonConvert.SerializeObject(styledDictionary, Formatting.None);
Также прямо здесь является ответом наочень похожий вопрос, который по сути делает то же самое, что я только что показал вам.
Также для тех, кто интересуется, что происходит, когда вы сериализуете YourTupel[]
против Dictionary<string, string>
против List<KeyValuePair<string, string>>
:
Serialized ArrayOfYourType:
[{"Name":"Key 0","Value":"Value 0"},{"Name":"Key 1","Value":"Value 1"}]
Serialized Dictionary:
{"Key 0":"Value 0","Key 1":"Value 1"}
Serialized List:
[{"Key":"Key 0","Value":"Value 0"},{"Key":"Key 1","Value":"Value 1"}]
РЕДАКТИРОВАТЬ:
Я предположил, что вынужен словарь (например, чтобы проверить, различны ли ключи или что-то вроде этого).Если вам вообще не нужен словарь, вы можете напрямую преобразовать массив, даже не делая каких-либо действий со словарем.
Код будет выглядеть так:
Ps.Редактирование этого ответа использует более изящные функции, чтобы сделать это еще чище, посмотрите его.
[Obsolete]
public string POB_CODE()
{
jsonOutputStyle[] styledDictionary = null;
try
{
using (OracleConnection Oconn = new OracleConnection(connectionORI))
{
_dicts = Oconn.Query<KeyValuePair<string, string>>(
"SELECT " +
"POB_CODE AS Key," +
"POB_DESC AS Value " +
"FROM " +
"POB_CODE " +
"WHERE " +
"DISPLAY_SORT_ORDER >=1 " +
"AND " +
"DISPLAY_SORT_ORDER <=60",
null
)
.Select(p => new jsonOutputStyle() { Name = p.Key, Value = p.Value }).ToArray();
}
}
catch (SqlException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
return JsonConvert.SerializeObject(styledDictionary, Formatting.None);
}