Short question: JSON ends by newline?

Added by Sebastian over 8 years ago

Jag kör följande:

String input = bufferedReader.readLine();

if( input.endsWith("\n") == false ) {
System.out.println("1: " + );
System.out.println("2");
}

Vilket ger följande output:

1: {"cmd":"trading_status","args":{"i":"101","m":11,"t":"trading_status","timestamp":"2012-06-27 10:12:06","status":"C","source_status":"Trading"}}
2

----------------------------------------
Tänker jag fel, eller verkar det inte som om svaren ej slutar med newline?

Mvh
Sebastian


Replies (7)

RE: Short question: JSON ends by newline? - Added by Björn over 8 years ago

Rätt säker på att readLine tar bort radbrytningar i strängen som returneras.

RE: Short question: JSON ends by newline? - Added by Sebastian over 8 years ago

Tack Björn, jag kan bekräfta att det stämmer efter att ha läst i javadocs.

Mitt problem blir väl då att på ett smidigt sätt kontrollera att svaren från servern är kompletta. Som Simon skrev i en annan tråd:

"We send each message in one tcp send chunk but as you probably know using TCP/IP there is no guarantee that the chunk is intact in the other end. That is why we end all JSON messages with newline."

Jag antar att jag kan använda BufferedReader:s read()-funktion och läsa tecken för tecken men detta känns osmidigt (kanske är ute och cyklar här).

Det jag vill göra är att kunna hantera följande:

"So you need to buffer all incoming messages and split them by the newline because each receive you have in your code can get either:
A complete JSON message.
A part of a JSON message.
More than one JSON message.
You need to handle all cases. "

RE: Short question: JSON ends by newline? - Added by Björn over 8 years ago

Njae, det blev nog lite fel där. TCP garanterar att all data når din applikation i samma ordning som det skickades från servern. Att det sedan kan bli flera paket av ett JSON-svar spelar ingen någon roll för dej, eftersom paketen redan ihopslagna till en ström av data i Java. Och angående radbrytningar så ska du nog tänka tvärt om, dvs läs en hel rad och det som du då får tillbaka garanterar Nordnet är ett helt JSON-objekt (eller en hel JSON-array, beroende på situation).

Jag kan inte se att du behöver göra någonting annat än att läsa rad för rad, precis som du gör och förutsätta att varje rad du får tillbaka innehåller ett komplett svar (för det lovar Nordnet att det ska vara). Piece of cake! :-)

RE: Short question: JSON ends by newline? - Added by Nordnet Simon over 8 years ago

Hej, jag är ingen Java expert men jag tror att Björn har rätt. Om du läser "rå" data från en socket måste du buffra och vänta in hela raden. Men jag har för mig att BufferedReader i Java löser det problemet åt dig och aldrig returnerar en ej komplett rad innan newline har kommit.

RE: Short question: JSON ends by newline? - Added by Sebastian over 8 years ago

Eller är det så att denna lokala buffer som behövs för att kolla att vi får hela JSON-svar redan är implementerad av BufferedReader i JAVA?

Jag läser följande på ett forum:
"At all other times, readLine() will block until there is a complete
line (i.e. a message terminated by a newline)."

Detta borde innebära att man ej behöver ta han om alla fall (A complete JSON message, A part of a JSON message, More than one JSON message) om man använder BufferedReader i JAVA?

RE: Short question: JSON ends by newline? - Added by Nordnet Simon over 8 years ago

Detta borde innebära att man ej behöver ta han om alla fall (A complete JSON message, A part of a JSON message, More than one JSON message) om man använder BufferedReader i JAVA?

Så tolkar jag Java dokumentationen.

RE: Short question: JSON ends by newline? - Added by Sebastian over 8 years ago

Missade era tidigare svar när jag postade senast. Tack för hjälpen! Skönt att inte behöva implementera detta :)

(1-7/7)