JSON and SAX parser

Hi,
How to pull data from simple JSON using SAX parser I know, but how to pull data from such JSON:

{
   "DailyForecasts":[
      {
         "Day":{
            "Icon":12,
            "IconPhrase":"Przelotne opady",
            "HasPrecipitation":true,
            "PrecipitationType":"Rain",
            "PrecipitationIntensity":"Light",
            "ShortPhrase":"Przelotne opady deszczu",
            "LongPhrase":"Przelotne opady deszczu",
            "PrecipitationProbability":84,
            "ThunderstormProbability":17,
            "RainProbability":84,
            "SnowProbability":0,
            "IceProbability":0,
            "Wind":{
               "Speed":{
                  "Value":11.1,
                  "Unit":"km/h",
                  "UnitType":7
               },
               "Direction":{
                  "Degrees":360,
                  "Localized":"N",
                  "English":"N"
               }
            },
            "WindGust":{
               "Speed":{
                  "Value":31.5,
                  "Unit":"km/h",
                  "UnitType":7
               },
               "Direction":{
                  "Degrees":43,
                  "Localized":"NE",
                  "English":"NE"
               }
            },
            "TotalLiquid":{
               "Value":1.6,
               "Unit":"mm",
               "UnitType":3
            },
            "Rain":{
               "Value":1.6,
               "Unit":"mm",
               "UnitType":3
            },
            "Snow":{
               "Value":0.0,
               "Unit":"cm",
               "UnitType":4
            },
            "Ice":{
               "Value":0.0,
               "Unit":"mm",
               "UnitType":3
            },
            "HoursOfPrecipitation":1.5,
            "HoursOfRain":1.5,
            "HoursOfSnow":0.0,
            "HoursOfIce":0.0,
            "CloudCover":89,
            "Evapotranspiration":{
               "Value":1.8,
               "Unit":"mm",
               "UnitType":3
            },
            "SolarIrradiance":{
               "Value":1763.8,
               "Unit":"W/m²",
               "UnitType":33
            },
            "RelativeHumidity":{
               "Minimum":60,
               "Maximum":80,
               "Average":71
            },
            "WetBulbTemperature":{
               "Minimum":{
                  "Value":11.6,
                  "Unit":"C",
                  "UnitType":17
               },
               "Maximum":{
                  "Value":14.5,
                  "Unit":"C",
                  "UnitType":17
               },
               "Average":{
                  "Value":12.9,
                  "Unit":"C",
                  "UnitType":17
               }
            },
            "WetBulbGlobeTemperature":{
               "Minimum":{
                  "Value":13.5,
                  "Unit":"C",
                  "UnitType":17
               },
               "Maximum":{
                  "Value":16.6,
                  "Unit":"C",
                  "UnitType":17
               },
               "Average":{
                  "Value":14.4,
                  "Unit":"C",
                  "UnitType":17
               }
            }
         }
      }
   ]
}

For example: DailyForecasts[0].Day.Rain.Value

Have you read it?
https://www.wago.com/global/d/2122395

1 Like

I used the function ‘Fb_JSON_ParseAndModify’ and I get the error ‘Parser not yet initialized’.

Simplifying the JSON to the form:

{
  "DailyForecasts": [
    {
      "Day": {
        "Icon": 3,
        "IconPhrase": "Czesciowo slonecznie",
        "HasPrecipitation": true,
        "ShortPhrase": "Slonce z lokalnymi zachmurzeniami",
        "LongPhrase": "Slonce z lokalnymi zachmurzeniami",
        "PrecipitationProbability": 1,
        "ThunderstormProbability": 0,
        "RainProbability": 1,
        "SnowProbability": 0,
        "IceProbability": 0,
        "Rain": {
          "Value": 0,
          "Unit": "mm",
          "UnitType": 3
        },
        "Snow": {
          "Value": 0,
          "Unit": "cm",
          "UnitType": 4
        }
        }
      }]
    }


Everything works.
Unfortunately, the original JSON has a more complicated structure.

I don’t understand from the last message, did everything work for you or do you still have questions?

If I use JSON in this form:

{
  "DailyForecasts": [
    {
      "Day": {
        "Icon": 3,
        "IconPhrase": "Czesciowo slonecznie",
        "HasPrecipitation": true,
        "ShortPhrase": "Slonce z lokalnymi zachmurzeniami",
        "LongPhrase": "Slonce z lokalnymi zachmurzeniami",
        "PrecipitationProbability": 1,
        "ThunderstormProbability": 0,
        "RainProbability": 1,
        "SnowProbability": 0,
        "IceProbability": 0,
        "Rain": {
          "Value": 0,
          "Unit": "mm",
          "UnitType": 3
        },
        "Snow": {
          "Value": 0,
          "Unit": "cm",
          "UnitType": 4
        }
        }
      }]
    }

and then I try to retrieve the value ‘/DailyForecasts/0/Day/Rain/Value’ then everything is ok. I get what I want. Unfortunately when for testing I use this:

{
   "DailyForecasts":[
      {
         "Day":{
            "Icon":12,
            "IconPhrase":"Przelotne opady",
            "HasPrecipitation":true,
            "PrecipitationType":"Rain",
            "PrecipitationIntensity":"Light",
            "ShortPhrase":"Przelotne opady deszczu",
            "LongPhrase":"Przelotne opady deszczu",
            "PrecipitationProbability":84,
            "ThunderstormProbability":17,
            "RainProbability":84,
            "SnowProbability":0,
            "IceProbability":0,
            "Wind":{
               "Speed":{
                  "Value":11.1,
                  "Unit":"km/h",
                  "UnitType":7
               },
               "Direction":{
                  "Degrees":360,
                  "Localized":"N",
                  "English":"N"
               }
            },
            "WindGust":{
               "Speed":{
                  "Value":31.5,
                  "Unit":"km/h",
                  "UnitType":7
               },
               "Direction":{
                  "Degrees":43,
                  "Localized":"NE",
                  "English":"NE"
               }
            },
            "TotalLiquid":{
               "Value":1.6,
               "Unit":"mm",
               "UnitType":3
            },
            "Rain":{
               "Value":1.6,
               "Unit":"mm",
               "UnitType":3
            },
            "Snow":{
               "Value":0.0,
               "Unit":"cm",
               "UnitType":4
            },
            "Ice":{
               "Value":0.0,
               "Unit":"mm",
               "UnitType":3
            },
            "HoursOfPrecipitation":1.5,
            "HoursOfRain":1.5,
            "HoursOfSnow":0.0,
            "HoursOfIce":0.0,
            "CloudCover":89,
            "Evapotranspiration":{
               "Value":1.8,
               "Unit":"mm",
               "UnitType":3
            },
            "SolarIrradiance":{
               "Value":1763.8,
               "Unit":"W/m²",
               "UnitType":33
            },
            "RelativeHumidity":{
               "Minimum":60,
               "Maximum":80,
               "Average":71
            },
            "WetBulbTemperature":{
               "Minimum":{
                  "Value":11.6,
                  "Unit":"C",
                  "UnitType":17
               },
               "Maximum":{
                  "Value":14.5,
                  "Unit":"C",
                  "UnitType":17
               },
               "Average":{
                  "Value":12.9,
                  "Unit":"C",
                  "UnitType":17
               }
            },
            "WetBulbGlobeTemperature":{
               "Minimum":{
                  "Value":13.5,
                  "Unit":"C",
                  "UnitType":17
               },
               "Maximum":{
                  "Value":16.6,
                  "Unit":"C",
                  "UnitType":17
               },
               "Average":{
                  "Value":14.4,
                  "Unit":"C",
                  "UnitType":17
               }
            }
         }
      }
   ]
}

then the function ‘Fb_JSON_ParseAndModify’ returns the error ‘Parser not yet initialized’. I searched for information about it but can’t find anything.

The JSON format seems to be correct. Can I see some of the code?

	pogoda_dn			: STRING(10000) := '{"DailyForecasts":[{"Day":{"Icon":12,"IconPhrase":"Przelotne opady","HasPrecipitation":true,"PrecipitationType":"Rain","PrecipitationIntensity":"Light","ShortPhrase":"Przelotne opady deszczu","LongPhrase":"Przelotne opady deszczu","PrecipitationProbability":84,"ThunderstormProbability":17,"RainProbability":84,"SnowProbability":0,"IceProbability":0,"Wind":{"Speed":{"Value":11.1,"Unit":"km/h","UnitType":7},"Direction":{"Degrees":360,"Localized":"N","English":"N"}},"WindGust":{"Speed":{"Value":31.5,"Unit":"km/h","UnitType":7},"Direction":{"Degrees":43,"Localized":"NE","English":"NE"}},"TotalLiquid":{"Value":1.6,"Unit":"mm","UnitType":3},"Rain":{"Value":1.6,"Unit":"mm","UnitType":3},"Snow":{"Value":0,"Unit":"cm","UnitType":4},"Ice":{"Value":0,"Unit":"mm","UnitType":3},"HoursOfPrecipitation":1.5,"HoursOfRain":1.5,"HoursOfSnow":0,"HoursOfIce":0,"CloudCover":89,"Evapotranspiration":{"Value":1.8,"Unit":"mm","UnitType":3},"SolarIrradiance":{"Value":1763.8,"Unit":"W/m²","UnitType":33},"RelativeHumidity":{"Minimum":60,"Maximum":80,"Average":71},"WetBulbTemperature":{"Minimum":{"Value":11.6,"Unit":"C","UnitType":17},"Maximum":{"Value":14.5,"Unit":"C","UnitType":17},"Average":{"Value":12.9,"Unit":"C","UnitType":17}},"WetBulbGlobeTemperature":{"Minimum":{"Value":13.5,"Unit":"C","UnitType":17},"Maximum":{"Value":16.6,"Unit":"C","UnitType":17},"Average":{"Value":14.4,"Unit":"C","UnitType":17}}}}]}';
	jsonParseAndMod	: Fb_JSON_ParseAndModify;
	jsonParseAndMod_path	: STRING := '/DailyForecasts/0/Day/Rain/Value';
	xTriggerJSONParser: BOOL;
	xTriggerJSONParser1: BOOL;
	wart	: typJSON_Pointer;
jsonParseAndMod(
	pData:=ADR(pogoda_dn) , 
	udiSizeData:=SIZEOF(pogoda_dn) ,
 	xTrigger:=xTriggerJSONParser
	);

wart := jsonParseAndMod.GetValueByPath(
	sPointer:=jsonParseAndMod_path , 
 	xTrigger:=xTriggerJSONParser1
	);

Thank you. I found something. There is some limitation, maybe on the length.
I got an error:
‘Not enough tokens were provided ->constant JSON_MAX_TOKEN_COUNT too small’
Have you encountered such an error?

I got this error:

Maybe it’s important, I’m testing it in simulation mode

I took the path of simplification. And I noticed that if you add a couple of variables, it’s already an error.
Example 1. Everything is fine:
‘{“DailyForecasts”:[{“Day”:{“Icon”:12,“IconPhrase”:“Przelotne opady”,“HasPrecipitation”:true,“PrecipitationType”:“Rain”,“PrecipitationIntensity”:“Light”,“ShortPhrase”:“Przelotne opady deszczu”,“LongPhrase”:“Przelotne opady deszczu”,“PrecipitationProbability”:84,“111”:84,“ThunderstormProbability”:17,“RainProbability”:84,“SnowProbability”:0,“IceProbability”:0,“Wind”:{“Speed”:{“Value”:11.1,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:360,“Localized”:“N”,“English”:“N”}},“WindGust”:{“Speed”:{“Value”:31.5,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:43,“Localized”:“NE”,“English”:“NE”}},“TotalLiquid”:{“Value”:1.6,“Unit”:“mm”,“UnitType”:3},“Rain”:{“Value”:5.6,“Unit”:“mm”,“UnitType”:3},“Snow”:{“Value”:0.0,“Unit”:“cm”,“UnitType”:4},“Evapotranspiration”:{“Value”:1.8,“Unit”:“mm”,“UnitType”:3}}}]}’

Example 2. Error, only one parameter was added:
‘{“DailyForecasts”:[{“Day”:{“Icon”:12,“IconPhrase”:“Przelotne opady”,“HasPrecipitation”:true,“PrecipitationType”:“Rain”,“PrecipitationIntensity”:“Light”,“ShortPhrase”:“Przelotne opady deszczu”,“LongPhrase”:“Przelotne opady deszczu”,“PrecipitationProbability”:84,“111”:84,“113”:85,“ThunderstormProbability”:17,“RainProbability”:84,“SnowProbability”:0,“IceProbability”:0,“Wind”:{“Speed”:{“Value”:11.1,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:360,“Localized”:“N”,“English”:“N”}},“WindGust”:{“Speed”:{“Value”:31.5,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:43,“Localized”:“NE”,“English”:“NE”}},“TotalLiquid”:{“Value”:1.6,“Unit”:“mm”,“UnitType”:3},“Rain”:{“Value”:5.6,“Unit”:“mm”,“UnitType”:3},“Snow”:{“Value”:0.0,“Unit”:“cm”,“UnitType”:4},“Evapotranspiration”:{“Value”:1.8,“Unit”:“mm”,“UnitType”:3}}}]}’

Can you check your examples?

try to increase JSON_MAX_TOKEN_COUNT

Increasing JSON_MAX_TOKEN_COUNT solves the problem from @TomasD’s example but if the JSON is even larger then I get an error: JSON_ERROR_PARSER ‘Parser not yet initialized’.
What exactly does this error mean?

json

Give us some time and we will definitely figure it out.
Of course you can do it now. This will remove the unnecessary stuff and it will work. But let’s try to get to the point.

Is this your final line?
‘{“DailyForecasts”:[{“Day”:{“Icon”:12,“IconPhrase”:“Przelotne opady”,“HasPrecipitation”:true,“PrecipitationType”:“Rain”,“PrecipitationIntensity”:“Light”,“ShortPhrase”:“Przelotne opady deszczu”,“LongPhrase”:“Przelotne opady deszczu”,“PrecipitationProbability”:84,“ThunderstormProbability”:17,“RainProbability”:84,“SnowProbability”:0,“IceProbability”:0,“Wind”:{“Speed”:{“Value”:11.1,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:360,“Localized”:“N”,“English”:“N”}},“WindGust”:{“Speed”:{“Value”:31.5,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:43,“Localized”:“NE”,“English”:“NE”}},“TotalLiquid”:{“Value”:1.6,“Unit”:“mm”,“UnitType”:3},“Rain”:{“Value”:1.6,“Unit”:“mm”,“UnitType”:3},“Snow”:{“Value”:0,“Unit”:“cm”,“UnitType”:4},“Ice”:{“Value”:0,“Unit”:“mm”,“UnitType”:3},“HoursOfPrecipitation”:1.5,“HoursOfRain”:1.5,“HoursOfSnow”:0,“HoursOfIce”:0,“CloudCover”:89,“Evapotranspiration”:{“Value”:1.8,“Unit”:“mm”,“UnitType”:3},“SolarIrradiance”:{“Value”:1763.8,“Unit”:“W/mІ”,“UnitType”:33},“RelativeHumidity”:{“Minimum”:60,“Maximum”:80,“Average”:71},“WetBulbTemperature”:{“Minimum”:{“Value”:11.6,“Unit”:“C”,“UnitType”:17},“Maximum”:{“Value”:14.5,“Unit”:“C”,“UnitType”:17},“Average”:{“Value”:12.9,“Unit”:“C”,“UnitType”:17}},“WetBulbGlobeTemperature”:{“Minimum”:{“Value”:13.5,“Unit”:“C”,“UnitType”:17},“Maximum”:{“Value”:16.6,“Unit”:“C”,“UnitType”:17},“Average”:{“Value”:14.4,“Unit”:“C”,“UnitType”:17}}}}]}’

After changing to 500 everything works.

this is final : JSON
and it returns JSON_ERROR_PARSER

for codesys I prepare JSON using this

For the test, I changed JSON_MAX_TOKEN_COUNT from 500 to 5000 and everything works.
Strange that I get 2 different errors that can be fixed in the same way (by increasing JSON_MAX_TOKEN_COUNT ).

1 Like

I inserted the line:
{“Headline”:{“EffectiveDate”:“2024-05-11T08:00:00+02:00”,“EffectiveEpochDate”:1715407200,“Severity”:5,“Text”:“Przewidywane przelotne opady w: sobota” ,“Category”:“rain”,“EndDate”:“2024-05-11T20:00:00+02:00”,“EndEpochDate”:1715450400,“MobileLink”:“http://www.accuweather.com/ pl/pl/boguchwaowice/1414123/daily-weather-forecast/1414123?unit=c”,“Link”:“http://www.accuweather.com/pl/pl/boguchwaowice/1414123/daily-weather-forecast/ 1414123?unit=c”},“DailyForecasts”:[{“Date”:“2024-05-11T07:00:00+02:00”,“EpochDate”:1715403600,“Sun”:{“Rise”:" 2024-05-11T05:01:00+02:00",“EpochRise”:1715396460,“Set”:“2024-05-11T20:19:00+02:00”,“EpochSet”:1715451540},“Moon “:{“Rise”:“2024-05-11T06:46:00+02:00”,“EpochRise”:1715402760,“Set”:“2024-05-12T00:52:00+02:00”,” EpochSet”:1715467920,“Phase”:“WaxingCrescent”,“Age”:3},“Temperature”:{“Minimum”:{“Value”:3.9,“Unit”:“C”,“UnitType”:17} ,“Maximum”:{“Value”:17.6,“Unit”:“C”,“UnitType”:17}},“RealFeelTemperature”:{“Minimum”:{“Value”:2.8,“Unit”:“C “,“UnitType”:17,“Phrase”:“Zimno”},“Maximum”:{“Value”:19.3,“Unit”:“C”,“UnitType”:17,“Phrase”:“Przyjemnie”} },“RealFeelTemperatureShade”:{“Minimum”:{“Value”:2.8,“Unit”:“C”,“UnitType”:17,“Phrase”:“Zimno”},“Maximum”:{“Value”: 17,“Unit”:“C”,“UnitType”:17,“Phrase”:“Przyjemnie”}},“HoursOfSun”:4.6,“DegreeDaySummary”:{“Heating”:{“Value”:7,“Unit “:“C”,“UnitType”:17},“Cooling”:{“Value”:0,“Unit”:“C”,“UnitType”:17}},“AirAndPollen”:[{“Name”: “AirQuality”,“Value”:0,“Category”:“Dobre”,“CategoryValue”:1,“Type”:“Ozon”},{“Name”:“Grass”,“Value”:7,“Category “:“Średnie”,“CategoryValue”:2},{“Name”:“Mold”,“Value”:32767,“Category”:“Szkodliwe (os. wrażliwe)”,“CategoryValue”:3},{“Name”:“Ragweed”,“Value”:0,“Category”:“Dobre”,“CategoryValue”:1},{“Name”:“Tree”, “Value”:1,“Category”:“Dobre”,“CategoryValue”:1},{“Name”:“UVIndex”,“Value”:2,“Category”:“Dobre”,“CategoryValue”:1} ],“Day”:{“Icon”:12,“IconPhrase”:“Przelotne opady”,“HasPrecipitation”:true,“PrecipitationType”:“Rain”,“PrecipitationIntensity”:“Light”,“ShortPhrase”:“Przelotne opady deszczu”,“LongPhrase”:“Przelotne opady deszczu”,“PrecipitationProbability”:84,“ThunderstormProbability”:17,“RainProbability”:84,“SnowProbability”:0,“IceProbability”:0,“Wind”:{” Speed”:{“Value”:11.1,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:360,“Localized”:“N”,“English”: “N”}},“WindGust”:{“Speed”:{“Value”:31.5,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:43, “Localized”:“NE”,“English”:“NE”}},“TotalLiquid”:{“Value”:1.6,“Unit”:“mm”,“UnitType”:3},“Rain”:{” Value”:9.9,“Unit”:“mm”,“UnitType”:3},“Snow”:{“Value”:0,“Unit”:“cm”,“UnitType”:4},“Ice”: {“Value”:0,“Unit”:“mm”,“UnitType”:3},“HoursOfPrecipitation”:1.5,“HoursOfRain”:1.5,“HoursOfSnow”:0,“HoursOfIce”:0,“CloudCover”: 89,“Evapotranspiration”:{“Value”:1.8,“Unit”:“mm”,“UnitType”:3},“SolarIrradiance”:{“Value”:1763.8,“Unit”:“W/m²”,” UnitType”:33},“RelativeHumidity”:{“Minimum”:60,“Maximum”:80,“Average”:71},“WetBulbTemperature”:{“Minimum”:{“Value”:11.6,“Unit”: “C”,“UnitType”:17},“Maximum”:{“Value”:14.5,“Unit”:“C”,“UnitType”:17},“Average”:{“Value”:12.9,“Unit “:“C”,“UnitType”:17}},“WetBulbGlobeTemperature”:{“Minimum”:{“Value”:13.5,“Unit”:“C”,“UnitType”:17},“Maximum”:{ “Value”:16.6,“Unit”:“C”,“UnitType”:17},“Average”:{“Value”:14.4,“Unit”:“C”,“UnitType”:17}}},” Night”:{“Icon”:34,“IconPhrase”:“Przeważnie bezchmurnie”,“HasPrecipitation”:false,“ShortPhrase”:“Przeważnie bezchmurnie”,“LongPhrase”:“Przeważnie bezchmurnie”,“PrecipitationProbability”:10," ThunderstormProbability":0,“RainProbability”:10,“SnowProbability”:0,“IceProbability”:0,“Wind”:{“Speed”:{“Value”:11.1,“Unit”:“km/h”," UnitType":7},“Direction”:{“Degrees”:68,“Localized”:“ENE”,“English”:“ENE”}},“WindGust”:{“Speed”:{“Value”:24.1 ,“Unit”:“km/h”,“UnitType”:7},“Direction”:{“Degrees”:80,“Localized”:“E”,“English”:“E”}},“TotalLiquid” :{“Value”:0,“Unit”:“mm”,“UnitType”:3},“Rain”:{“Value”:0,“Unit”:“mm”,“UnitType”:3}}, “Sources”:[“AccuWeather”],“MobileLink”:"http://www.accuweather.com/pl/pl/boguchwaowice/1414123/daily-weather-forecast/1414123?day=1&unit=c","Link ":“http://www.accuweather.com/pl/pl/boguchwaowice/1414123/daily-weather-forecast/1414123?day=1&unit=c”}]}

There are 453 tokens in this request. For larger ones I recommend setting 600+
And I got the correct result. Everything works. I hope it works for you too.

1 Like

as I wrote earlier I came to this, now I am curious why I had 2 different errors

I don’t know why there were errors. But we found a solution to the problem. I think there is no point in understanding further.

simple curiosity :slight_smile:
Thanks for your help!

1 Like