Path: ...!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Malcolm McLean Newsgroups: comp.lang.c Subject: Re: Which newsgroup for json parsing? Date: Fri, 17 May 2024 18:07:09 +0100 Organization: A noiseless patient Spider Lines: 87 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Fri, 17 May 2024 19:07:10 +0200 (CEST) Injection-Info: dont-email.me; posting-host="1b1ca21d30aeebfc2b6e6baded786e38"; logging-data="2412719"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18yimiUTDJzTP2GZoe7esjRXLTVQjxYgwc=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:fdtcKjBhvDRf6tzOQzfJimmsx/I= Content-Language: en-GB In-Reply-To: Bytes: 4445 On 17/05/2024 17:39, jak wrote: > Malcolm McLean ha scritto: >> On 16/05/2024 20:21, bart wrote: >>> On 16/05/2024 19:53, Scott Lurndal wrote: >>>> =?UTF-8?Q?Josef_M=C3=B6llers?= writes: >>>>> On 16.05.24 18:27, Mikko wrote: >>>>>> On 2024-05-08 13:04:56 +0000, Josef Möllers said: >>>>>> >>>>>>> Hi all, >>>>>>> >>>>>>> I am trying to parse a json string received through MQTT from a >>>>>>> "Shelly Plug S", e.g. >>>>>>> {"id":0, "source":"button", "output":true, "apower":0.0, >>>>>>> "voltage":237.9, "current":0.000, >>>>>>> "aenergy":{"total":0.000,"by_minute":[0.000,0.000,0.000],"minute_ts":1715172119},"temperature":{"tC":41.1, "tF":106.0}} >>>>>>> >>>>>>> I am trying to use libjson-glib but I can't figure out what to >>>>>>> use as >>>>>>> the first argument to json_gobject_from_data()! >>>>>>> I am also looking at libjson-c but cannot find any examples that >>>>>>> could >>>>>>> guide me. >>>>>>> >>>>>>> Thanks in advance, >>>>>> >>>>>> Sometimes it is easier to make a parser than to use an existing one. >>>>>> In this case I might try LEX. >>>>>> >>>>> >>>>> Sorry to be nitpicking, but lex is a "lexical analyzer" aka a >>>>> "scanner", >>>>> it can only recognize tokens, eg the brackets, quotes, identifiers >>>>> etc, >>>>> but not structures. >>>>> "yacc" (or its "bison" equivalent" would be a parser but definitely >>>>> too >>>>> heavy. >>>>> >>>>> What one could do would be to use LEX to recognize the tokens and the >>>>> write a recursive descent parser in plain C. >>>> >>>> I've done full expression parsing and subsequent evaluation with >>>> lex (or flex).  No parser needed. >>>> >>> >>> You've done 'full expression PARSING', then you say 'No PARSER needed'. >>> >>> A bit contradictory? >>> >>> Clearly parsing IS needed, so either you've used LEX from code that >>> acts as a parser, or it does more than just recognise tokens. >>> >> Yes. >> >> I took Ben's advice and completely rewrote my XML parser wirh a formal >> lexer and recursive descent grammar. It was good idea, even though XML >> is simple enough to get away with a ad hoc approach. Similarly, with >> JSON. once you've lexed into identifiers, values, and curly and square >> btackets, the grammar is so simple that you almost don't notice that >> you are writing a parser. >>    -- >> Check out Basic Algorithms and my other books: >> https://www.lulu.com/spotlight/bgy1mm >> > > Don't you think it is overkill to use a compiler of compilers to parse a > Json?  The function I wrote for parse the Json is just 140 code lines in > C, while I found examples with much more bulky with lex & yacc. > > Yes. I did't use lex and yacc. I wrote a lexer in top of a strem of characters, the I coded the recursive decent parser by hand, with each rule a separate function. Here's the new code https://github.com/MalcolmMcLean/xmltocsv And here's the old code it replaced https://github.com/MalcolmMcLean/babyxrc/blob/master/src/xmlparser.c https://github.com/MalcolmMcLean/babyxrc/blob/master/src/xmlparser.h -- Check out Basic Algorithms and my other books: https://www.lulu.com/spotlight/bgy1mm