Прочитайте тип данных MySQL JSON и преобразуйте его в List в C#

#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)));
    }