I'd like my ESP8266 to provide some JSON endpoints. I want to use ArduinoJson for serialisation. While this works in general if I serialize into a String and return this String afterwards, I was wondering if there is really no way to do this without wasting so much memory. Shouldn't it be possible to do something like this? Any hints?
ESP8266WebServer server;
StaticJsonDocument<768> response;
response["night"] = _playback.isNight();
response["shuffle"] = _playback.isShuffle();
server.send_P(200, "application/json", NULL);
serializeJson(response, server.client());
(this gives the following error:)
no instance of overloaded function "serializeJson" matches the argument list -- argument types are: (ArduinoJson6141_0000010::StaticJsonDocument<768U>, WiFiServer::ClientType)
1 Answer 1
serializeJson()
accepts a Print&
, i.e, a reference to a class that implements the Print
interface.
WiFiClient
does implement the Print
interface, but serializeJson()
cannot make a reference to it because ESP8266WebServer::client()
returns a temporary. Indeed, C++ forbids references to temporary variables, only const
reference to temporaries are allowed.
To fix this compilation error, you must extract a variable:
WiFiClient client = server.client();
serializeJson(doc, client);
The way I see it, ESP8266WebServer::client()
should return a WiFiClient&
instead of a WiFiClient
, just as HTTPClient::getStream()
does. I opened issue #7075 about that.
Anyway, even it this fixes the compilation, I'm not sure it will work as you intend because ESP8266WebServer
may not allow writing directly to the WiFiClient
.
WiFiServer::ClientType
is defined asWiFiClient
, which inherits fromClient
, which inherits fromStream
, which inherits fromPrint
, which you should be able to serialize to. Could you try to serialize toSerial
, just to see if it works?