Sprawdzenie czy wartość znajduje się w JSON

0

Jak sprawdzić czy "string" jest poprawnie zapisany w cudzysłowie ? np. ze w pliku nie bedzie "stri"ng albo "string"""

2

Brzmi jak bardzo dziwny problem do rozwiązania, co tak na prawdę próbujesz zrobić?

Podaj więcej szczegółów i kontekstu.

0

chce sprawdzic czy w pliku json "string" jest cudzyslowie np. w json : "string" i cyz po : string jest poprawnie zapisany w cudzyslowie

0

Chce to zrobić w c++ bez json biblioteki

1
  1. std::regex (lub coś wydajniejszego) i odpowiednie wyrażenie regularne.
  2. Ręczne czytanie pliku znak po znaku.

Jeśli odrzucasz przypadek escape’owania cudzysłowów, tzn. "klucz": "wartość \" z wyescape’owanym cudzysłowem";, to być może Twój przypadek da się sprowadzić do „zero, dwa lub cztery " w każdej linii” + „" może być bezpośrednio poprzedzony tylko znakami białymi, lub : i znakami białymi, lub { i znakami białymi” + „bezpośrednio po " mogą wystąpić znaki białe i :, lub znaki białe i ;, lub znaki białe i }”.

Tym niemniej porada „użyj gotowego walidatora JSON-a” pokryje Ci znacznie więcej przypadków i będzie znacznie mniej błędogenna.

2
dayanuch napisał(a):

Jak sprawdzić czy "string" jest poprawnie zapisany w cudzysłowie ? np. ze w pliku nie bedzie "stri"ng albo "string"""

A dlaczego nie ?

"stri" jest bardzo fajnych stringiem wg podanej definicji
podobnie "string" jest bardzo ładny, a że POZA NIM jest jeszcze jeden apostrof ...

Dopóki nie wysilisz głowy, i nie zdefiniujesz dokładnie zagadnienia, na porządne tego zrobienie nie masz szans.
Również my nie mamy szans niczego skutecznego doradzić

Postawienie "żeby w pliku znaleźć string w pazurkach a reszta mnie nie obchodzi" jest źle zdefiniowanym zagadnieniem i być może nie do rozwiazania
Dwukrotne użycie funkcji C strchr da wynik,

char * p1 = strchr(zawartosc, '"');
if(p1!=null)
{
  char * p2 = strchr(p1+1,'"');
}

... tylko niczego w rzeczywistości to nie weryfikuje. Ew drugie wywołanie z strrchr - bez znaczenia o ile nie doprecyzujesz celów.

Jak na razie, w tzreciej "próbie objaśnienia" tematu tylko sie powtarzasz mantrę. Metoda "przecież bardzo chcę" niestety nie wystarczy

  • czym jest upragniony string - jakie znaki może zawierać
  • co w pliku może być oprócz "upragnionego stringa"
0
dayanuch napisał(a):

chce sprawdzic czy w pliku json "string" jest cudzyslowie np. w json : "string" i cyz po : string jest poprawnie zapisany w cudzyslowie

  • Czyli spodziewasz się dostać niepoprawnego JSONa, i próbujesz sprawdzić czy jest poprawny czy nie? Np

    {"a":"x" "x"} 
    
  • Czy może spodziewasz się dostać poprawny JSON, i chcesz sprawdzić czy występuje jakiś konkretny ciąg znaków w którymś kluczu?

    {"a":"inny string"} 
    

    a Ty chcesz znaleźc tylko "string"?

    I odpowiadając na drugie pytanie:

    dayanuch napisał(a):

Chce to zrobić w c++ bez json biblioteki

Jaki masz powód żeby nie używać biblioteki?

1
dayanuch napisał(a):

Chce to zrobić w c++ bez json biblioteki

Czyli sam chcesz napisać parser JSon-a?
No to czeka cię sporo pracy.
Możesz skorzystać, boost spirit (biblioteka pomagająca pisać ogólnie parsery), albo robić to krok po kroku samemu.
W tym celu zacznij od przeczytania oficjalnej specyfikacji JSona: RFC-8259.
Może też ktoś ci rekomenduje jakiś podręcznik, jak dobrze pisać parsery.

Na razie możemy tyle ci powiedzieć, bo towoje pytanie jest zbyt, ogólne.
Przyjdź z czymś bardziej konkretnym (wąskim problemem), pokaż jakiś kod który ci nie działa i wyjaśnij dokładnie co kod ma robić.

0

Próbowałem w taki sposób że znajduje : w pliku i następnie sprawdzam że po nim może być tylko null, true, false i liczba, i ten string

char * p1 = strchr(zawartosc, '"');
if(p1!=null)
{
  char * p2 = strchr(p1+1,'"');
}

Tym próbowałem, ale do tego trzeba dodać że " nie może być znaków i nie wiem czy do to końca działa poprawnie

0
dayanuch napisał(a):

Próbowałem w taki sposób że znajduje : w pliku i następnie sprawdzam że po nim może być tylko null, true, false i liczba, i ten string

char * p1 = strchr(zawartosc, '"');
if(p1!=null)
{
  char * p2 = strchr(p1+1,'"');
}

Tym próbowałem, ale do tego trzeba dodać że " nie może być znaków i nie wiem czy do to końca działa poprawnie

Oczywiście że nie działa poprawnie, nie tak należy podejść do tego problemu.

@dayanuch: Opisz dokładnie co próbujesz zrobić, z większym kontekstem.

2

Rozmawiałem z autorem wątku na priv, i z tego co rozumiem to autor chce napisać sam parser JSON'a.

  • Ma się wywalić, jak dostanie niepoprawny JSON
  • Ma parsować tylko pierwszy poziom obiektu (czyli zagnieżdżone obiekty i zagnieżdżone listy są traktowane jako niepoprawny input)
  • Ma sprawdzić czy w podanym JSON'ie znajduje się zadana wartość tekstowa (tzn ma sprawdzić czy istnieje np wartość "car", ale wartość "carpet" ma nie być uznana za znalezioną).

@dayanuch: A skoro tak, to nie mam dla Ciebie dobrych wiadomości, bo nie da się tego załatwić "jedna funkcją", musisz przeiterować po każdym znaku Twojego wejścia, i odpowiednio go sparsować. Nie możesz po prostu użyć sobie strchr() i wyciągnąć wartośc, bo taki algorytm mógłby zostać bardzo łatwo oszukany takim wejściem:

{
   "klucz": "{\"fake-key\": \"fake value\", \"other-key\": 12}",
   "other-key": "value"
}

Napisanie takiego parsera, to dużo pracy, zwłaszcza jeśli ma parsować np JSON' z Unicode, i miałby się wywalić dla niepoprawny code'pointów unicode.

Nadal nie rozumiem czemu chcesz napisać swoj parser, zamiast skorzystać z istniejącego?

0
MarekR22 napisał(a):
dayanuch napisał(a):

Chce to zrobić w c++ bez json biblioteki

Czyli sam chcesz napisać parser JSon-a?
No to czeka cię sporo pracy.
Możesz skorzystać, boost spirit (biblioteka pomagająca pisać ogólnie parsery), albo robić to krok po kroku samemu.
W tym celu zacznij od przeczytania oficjalnej specyfikacji JSona: RFC-8259.
Może też ktoś ci rekomenduje jakiś podręcznik, jak dobrze pisać parsery.

Na razie możemy tyle ci powiedzieć, bo towoje pytanie jest zbyt, ogólne.
Przyjdź z czymś bardziej konkretnym (wąskim problemem), pokaż jakiś kod który ci nie działa i wyjaśnij dokładnie co kod ma robić.

"Z jakich części jest zbudowana rakieta Saturn V, bo chcę ją zrobić i polecieć na Ksieżyć"

No to czeka cię sporo pracy.

W przypadku umiejętności OP, nieskończenie dużo pracy. Nie tylko koderskich, tego chyba można się nauczyć, ale elementarne logiczne wyrażanie myśli bardzo cierpi. MSZ boost::spityt to "trochę" poza zasięgiem OP.

@dayanuch:
parsowanie, nawet uproszczonego pod-standardu (jako zadanie szkolne - może mi się pdoobać), to może nie genialny proces, ale bardzo systematyczny (tak systematyczny, że od dawna są bdb generatory parserów). *)
Mozesz o tym myśleć jako (rekurencyjna) maszyna stosowa

  1. czy otworzył nam się poprawny obiekt JSON: tak / nie
  2. jeśli tak, próbujemy analizować pierwszą właściwość, pierwsza oczekiwana jest prawidłowa nazwa
  3. jeśli jest prawidłowo zaczęta ... itd.

Kazdy element gramatyki przekłada się na podfunckję / metodę, if, while , do while (lub zrywa przetwarzanie uznjaąc plik za błędny)

*) jest eleganckie i łatwe (choć pracochłonne) jak już się to "ma" - jest niemożliwe metodą rąbania na siłę.
Pamiętam na studiach, BARDZO CHCIAŁEM (o wiele wyprzedzajac program) napisać parser czegoś tam prostego, w ciągu kilku mc niczego nie uzyskałem, tylko syfiaste spagetti. Rok później w ciągu mniej niż miesiąca napisałem parser wiele bardziej złożonego języka , z wysoką niezawodnością, elastycznością na poprawki (gramatyki pliku) - gdy już rozumiałem teoretycznie.

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