Wczytanie i zapisywanie ciągu JSON z komentarzami

0

Tak się zastanawiam , inżynier edytuje pliki konfiguracji JSON i dopisuje komentarze
nie inżynier posiada interfejs KLIK-KLIK i też edytuje ten sam plik JSON ale za pomocą GUI
Jak zachować komentarze przy zapisaniu w GUI ?

// przykład z https://json.nlohmann.me/features/comments/
// https://godbolt.org/z/TWGvP1eE5
#include <iostream>
//#define JSON_DIAGNOSTICS 0   // dodatkowa diagnostyka na konsoli 
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main()
{
    std::string s = R"(
    {
            // update in 2006: removed Pluto
        "planets": ["Mercury", "Venus", "Earth", "Mars",
                    "Jupiter", "Uranus", "Neptune" /*, "Pluto" */ ]
    }
    )";


    try
    {
        json j = json::parse(s);
    }
    catch (json::exception &e)
    {
        std::cout << e.what() << std::endl;
    }

    json j = json::parse(s,
                         /* callback */ nullptr,
                         /* allow exceptions */ true,
                         /* ignore_comments */ true);
    std::cout << j.dump(2) << '\n';
    std::cout << "EOF\n";
}
0

Standard standardem a życie życiem ;)
Na stronach Microsoftu dla programistów tez pojawia się komentarz w JSON ;) Choć ta firma nigdy nie trzymała standardów i to nie najlepszy przykład
Visual Studio Code tez ma tak zrobioną konfiguracje że można edytować ręcznie z komentarzami a potem wyklinać i komentarze zostają, zamarzyło mi się podobnie.

1

Hmm. Może podaj przykład z życia takiego pliku z tej dokumentacji. Bo może to było tylko edukacyjnie dopisane. Nie znam się na C/C++ ale to co opisujesz to raczej próba złamania standardu i chyba musiałbyś własny parser napisać.

3

widziałem gdzieś modyfikacje formatu JSON, że są komentarze. Tylko to nie jest standardowy JSON i nie nadaje się to jako przenośny format. No i ja to widziałem w ekosystemie JS, nie wiem czy jest do tego parser w C++

Mógłbyś tez zapisywać to w YAML zamiast w JSON, a tam już są komentarze. Tylko znowu - to inny format, chociaż mógłbyś to jakoś przekonwertować potem do JSON.

Albo możesz po prostu zapisywać te komentarze w jakimś dodatkowym polu w JSON:


 
           "comment": "update in 2006: removed Pluto",
        "planets": ["Mercury", "Venus", "Earth", "Mars",
                    "Jupiter", "Uranus", "Neptune" ]

Tylko, że byłoby to na mocy konwencji. Jakbyś podawał tego JSONa gdzieś dalej, to te dane mogłyby zostać źle zinterpretowane jako coś ważnego

1
Adamek Adam napisał(a):

Tak się zastanawiam , inżynier edytuje pliki konfiguracji JSON i dopisuje komentarze
nie inżynier posiada interfejs KLIK-KLIK i też edytuje ten sam plik JSON ale za pomocą GUI

Dla mnie to wygląda tak, że:

  • Dwie osoby korzystają z pewnej technologii czy formatu
  • Ta technologia nie do końca spełnia ich oczekiwania (np nie ma komentarzy)
  • Więc te osoby dodają coś co jest nie za bardzo zgodne z tą technologią, i "nawet działa"
  • Potem trzeba coś dodać, zmienić albo żyć z tym
  • I pojawia się taki absurdalny pomysł: "SIEMA JAK DODAC KOMENTARZE DO JSON'a".

Ja osobiście nie znam żadnego formatu JSON-ono podobnego który miałbym komentarze. Więc moim zdaniem wyjscia jakie masz to:

  • Albo skorzystać z innego formatu, jak mówili przed mówiący (np yaml)
  • Albo "wymyślić" swój format (chociaż wygląda że już wymyśliliście: JSON z komentarzami) i napisać odpowiednie parsery i serializery do niego, ale łatwe to nie będzie.
Adamek Adam napisał(a):

Jak zachować komentarze przy zapisaniu w GUI ?

Zachować moim zdaniem się nie da, bo komentarze nie są elementem tego formatu.

Masz do wyboru albo skorzystać z gotowego narzędzia (ale narzędzia są tworzone z reguł do istniejących formatów, a formatu który wspiera komentarze w JSON raczej nie ma); albo napisać samemu swój serializer i parser.

0

Jak to nie jest takie proste (na 10 minut) to warto się zastanowić czy brnąc w tym kierunku.

nlohmann::json wczytuje poprawnie pliki z komentarzami , ma też wbudowany mechanizm podczepienia własnej funkcji w proces parsowania JSON,
wiec teoretycznie dało by się to zrobić bez rozkopywania biblioteki, zapisać komentarze poza obiektem i przy zapisaniu odtworzyć , takie subtelne rozszerzenie.

Koncept:

  • przerobić aby callback przechwytywał komentarze (w tym monecie parser przeskakuje do końca komentarza )
  • w callback użytkownika zapamiętać komentarz oraz obiekt którego dotyczy np. std:map<string,string>
  • dodać funkcję która zwraca JSON z zapamiętanymi komentarzami

1 użytkowników online, w tym zalogowanych: 0, gości: 1