Извлечение JSON из строк с системным журналом в C # - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь проанализировать ответ системного журнала (или похожий на системный журнал), чтобы извлечь только JSON

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": detail, "detail2": detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": detail, "detail2": detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": detail, "detail2": detail"}}

Я хочу удалить "<14> 1 09 30 2019 15:34:37 UTC logsource "префикс, так что оставшиеся данные являются допустимым JSON, поэтому я могу отправлять каждую строку в базу данных. Я полагаю, что вывод будет выглядеть примерно так:

{
    "body" [
        {
            "somejson": "thejson",
            "details": {
                "detail1": details,
                "detail2": details.
            }
        },
        {
            "somejson": "thejson",
            "details": {
                "detail1": details,
                "detail2": details.
            }
        },
        {
            "somejson": "thejson",
            "details": {
                "detail1": details,
                "detail2": details.
            }
        }
    ]
}

Возможно, я мог бы перебрать исходные данные и заменить строку, используя String.Replace как-нибудь? Я ценю любую помощь, даже если она просто направляет меня в правильном направлении.

1 Ответ

0 голосов
/ 30 сентября 2019

Один из способов сделать это - использовать Newtonsoft.Json. Вы можете разобрать строку в JObject после того, как вы удалите префикс журнала, который вам не нужен. Я также пошел дальше и удалил пустые строки в вашем вводе. Вот код, который я использовал для этого:

using System;
using System.Linq;
using System.IO;
using Newtonsoft.Json.Linq;

namespace extractingJSONSyslogQuestion
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = File.ReadAllText("test.txt");
            var lines = input.Split("\n");

            // Remove blank lines
            lines = lines.Where(l => !string.IsNullOrEmpty(l)).ToArray();

            foreach(var line in lines) {
                // Get rid of log prefix
                var data = line.Substring(line.IndexOf("{"));
                var json = JObject.Parse(data);
                Console.WriteLine(json);
            }
        }
    }
}

Вот файл ввода, который я использовал. Обратите внимание, что я добавил двойные кавычки вокруг строки «detail», чтобы сделать его действительным json:

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": "detail", "detail2": "detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": "detail", "detail2": "detail"}}

<14>1 09 30 2019 15:34:37 UTC logsource {"somejson": "thejson", "details": {"detail1": "detail", "detail2": "detail"}

Наконец, вот вывод из моей программы:

{
  "somejson": "thejson",
  "details": {
    "detail1": "detail",
    "detail2": "detail"
  }
}
{
  "somejson": "thejson",
  "details": {
    "detail1": "detail",
    "detail2": "detail"
  }
}
{
  "somejson": "thejson",
  "details": {
    "detail1": "detail",
    "detail2": "detail"
  }
}

Я счастливответьте на любые вопросы о коде более подробно, если вы оставите комментарий.

...