Почему этот вопрос не дублируется? (Добавлено после просмотра комментариев)Как найти все отдельные ключи json-записей в C#?
- Не имеет отношения к структуре Entity.
- Он должен разбирать огромные файлы json и находить разные ключи, но не записи!
У меня есть 200+ файлов, и каждый из них - 2+ ГБ, подразумевает общий размер 400+ ГБ. Каждая строка в этих файлах представляет собой строку json. У меня нет json schema
для записей заранее. Моя задача - найти все ключи в этих файлах.
Я написал следующий код, чтобы получить все отдельные ключи от всех этих json-записей. Я вызываю следующий метод с использованием многопоточного for-loop
от main
.
private void GetTokensFromJson(string filePath)
{
IEnumerable<string> txts = File.ReadLines(filePath, Encoding.UTF8);
Console.WriteLine(txts.Count());
List<string> distinctKeys = new List<string>();
foreach (var text in txts)
{
string pattern = "{\"";
foreach (Match m in Regex.Matches(text, pattern))
{
//string matchValue = m.Value;
int matchIndex = m.Index;
string subStr=text.Substring(matchIndex+2, text.Length - matchIndex - 3);
int quoteIndex=subStr.IndexOf('\"');
string jsonKey = subStr.Substring(0, quoteIndex);
if (!distinctKeys.Contains(jsonKey) && !jsonKey.Contains("\\"))
{
Console.WriteLine(jsonKey);
distinctKeys.Add(jsonKey);
}
}
string secondPattern="\":";
foreach (Match m in Regex.Matches(text, secondPattern))
{
int matchIndex = m.Index;
string revJsonKKey = "";
while(matchIndex>0)
{
matchIndex--;
if (text[matchIndex] != '\"')
revJsonKKey += text[matchIndex];
else
break;
}
IEnumerable<char> jsonKeyCharArray = revJsonKKey.Reverse();
string jsonKey="";
foreach(char c in jsonKeyCharArray)
{
jsonKey += c;
}
if (!distinctKeys.Contains(jsonKey) && !jsonKey.Contains("\\"))
{
Console.WriteLine(jsonKey);
distinctKeys.Add(jsonKey);
}
}
}
distinctKeys
имеет все различные ключи JSon. Но я пропускаю несколько ключей и добавляю ненужные ключи, не знаю почему: |. Я не могу отлаживать данный ввод, поскольку он слишком велик! Кроме того, этот метод слишком медленный.
Для того, чтобы прояснить ситуацию, давайте рассмотрим пример, если файлы имеют следующий JSON,
{"id":"123", "name":"hello, world", "department":[{"name":"dept1", "deptID":"123"}]}
{"id":"456324", "department":[{"name":"dept2", "deptID":"456"}]}
Ожидаемое выход является id,name,department, department->name, department->deptID
. Форматирование вывода не имеет значения. Обратите внимание, что не все записи json не будут иметь всех ключей, а запись json может содержать вложенные записи json.
Я два вопросы,
- Что я делаю не так в коде?
- Есть ли встроенная или сторонняя dll, которая даст мне выход в качестве ключей json, когда я даю ввод как сложную запись json?
У вас есть два вопроса в одном, и я боюсь, что оба они могут сигнализировать все это как не по теме вопрос. _why не этот код работает? _ и _recommend или найти книгу, инструмент, библиотеку программного обеспечения, учебник или другой ресурс вне сайта. – melancia
Я думаю, вы понимаете мои намерения :) Можете ли вы помочь мне в решении вопроса? В любом случае, код работает, но имеет ошибку: | – Abhishek
Это не помогает моему делу, так как мне нужно разбирать json здесь и в сущности, вы знаете ключи! Вы должны просто сделать разный. Я не хочу найти разные записи. – Abhishek