#c# #mysql #json #list #varchar
#c# #mysql — сервер #json #Список #varchar #mysql
Вопрос:
Я пытаюсь вернуть список чисел из базы данных mysql, которая имеет тип данных JSON в таблице.
mysql.connector в c # считает, что тип данных — VARCHAR, поэтому в основном я получаю в ответ «[1, 2, 3]» из базы данных.
Мне нужно преобразовать возвращаемую строку в List<INT>, чтобы я мог работать с ней напрямую.
чтобы быть более конкретным, это то, что я получаю от программы чтения mysql
string mylist = "[1, 2, 3]"
и я хочу отлить его в
List<Int> mylist_int = [1, 2, 3]
Так что, если есть способ прочитать тип данных JSON из базы данных непосредственно в формате JSON, это было бы здорово.
в качестве альтернативы я ищу способ проанализировать список строк и преобразовать его в собственный список c #.
Спасибо,
Комментарии:
1. A
List<int>
не является JSON. Это то, что создается после разбора JSON. В JSON также есть массивы, а не списки. Предполагая, что MySQL Connector возвращает тип JSON, ему все равно потребуется какое-то преобразование, прежде чем он станетList<int>
2. Как вы читаете этот результат? MySQL/Connector. NET не просто считает JSON строкой, он явно считывает его как строку и возвращает MySqlString . Вы можете проанализировать это с помощью Json.NET , возможно, самый популярный сериализатор JSON в .NET
3. @PanagiotisKanavos У меня в основном есть объект reader, и после запуска команды mysql я использую Reader. Получите значение (номер столбца int), чтобы получить данные.
4.
GetValue()
вернет любой базовый тип. Он не выполняет никакого синтаксического анализа. Это явно указано как строка в связанном исходном коде5. вы правы, есть другие
GetValue(), GetInt64(), etc..
функции, но для JSON ничего нет. и когда я проверилGetDataType()
, он вернул VARCHAR. который, как вы сказали, в конце будет строкой.
Ответ №1:
Используйте анализатор JSON, подобныйJSON.NET для анализа строки JSON, например :
var json=reader.GetString(0);
//Returns a List<int>
var myList=JsonConvert.DeserializeObject<List<int>>(json);
или
var jsonArray=JArray.Parse(json);
Соединитель MySQL явно обрабатывает JSON как строку, он не «думает», что они являются текстом :
case MySqlDbType.Set:
case MySqlDbType.Enum:
case MySqlDbType.String:
case MySqlDbType.VarString:
case MySqlDbType.VarChar:
case MySqlDbType.Text:
case MySqlDbType.TinyText:
case MySqlDbType.MediumText:
case MySqlDbType.LongText:
case MySqlDbType.JSON:
case (MySqlDbType)Field_Type.NULL:
return new MySqlString(type, true);
Собственные тесты библиотеки используют GetString()
для чтения данных JSON :
[Fact]
public void CanReadJsonValue()
{
...
using (MySqlDataReader reader = cmd.ExecuteReader())
{
Assert.True(reader.Read());
Assert.Equal("["a", {"b": [true, false]}, [10, 20]]", reader.GetString(0));
}
}
Комментарии:
1. Спасибо!
JSON.NET
выполнил задание. 👌
Ответ №2:
вы могли бы использовать List<dynamic>
. вы можете вызывать все функции, с помощью которых вы можете List<int>
. единственная проблема в том, что вы не сможете их увидеть из-за динамики, но это будет работать.
Комментарии:
1. Что будет работать? Как вы можете заставить MySQL Connector / .NET возвращать список чего угодно, если в программе чтения данных нет такого метода?
2. извините, я не очень хорошо понял вопрос. но если вы хотите, чтобы ваш список строк был списком целых чисел, вы могли бы использовать
List<int> yourIntList = youStringList.Select(int.Parse).ToList()
3. Сначала я использовал этот способ, но затем данные должны быть сохранены как «1, 2, 3» в базе данных, а не «[1, 2, 3]», потому что четные скобки обрабатываются как числа, которые вызывают ошибку. Я думаю, что работа со значением в виде строки не подходит с самого начала. должно быть что-то для сериализации и десериализации типов данных JSON из соединителя mysql.
4. Списка строк нет, только строка JSON, которая нуждается в разборе
Ответ №3:
Вы можете использовать эту функцию для преобразования значения [1,2,3,4] из базы данных в список
private static List<int> ParseDbInt(string databaseValue)
{
// Remove brackets
var numStr = databaseValue.Replace("[", String.Empty);
numStr = numStr.Replace("]", String.Empty);
// Now split that string into a string array using String.Split
var numbers = numStr.Split(new char[] { ',' });
// Split the comma-seperated numbers into a List using LINQ "Select" keyword
return new List<int>(numbers.Select(s => int.Parse(s)));
}