Kevin Van Den Broek Kevin Van Den Broek - 1 year ago 327
JSON Question

NewtonSoft json converter " unterminated String, expected delimiter : "; "

I am trying to parse a json response that I get when calling a rest API.
The problem I am facing is that the deserializing doesn't work every time, even though I am making the same request. I don't know how to fix it since a try.catch is not making anything better.

Also, when I am trying to parse a very big response (20+ json objects) the program never works.

I have googled the problem myself but I don't know the solution..

Unterminated string. Expected delimiter: ". Path 'drinks[0].strMeasure4', line 3, position 720.

is one of the errors I am getting, it is never the same.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using ConsoleApplication1;

namespace TCPclient
class Program
static void Main(string[] args)

TcpClient client = new TcpClient();

client.Connect("", 80); // geen http
string request = getRequestCoctail("margarita");

NetworkStream stream = client.GetStream();

byte[] buffer = Encoding.Default.GetBytes(request);

stream.Write(buffer, 0, buffer.Length);
StringBuilder message = new StringBuilder();
int numberOfBytesRead = 0;
byte[] receiveBuffer = new byte[1024];

numberOfBytesRead = stream.Read(receiveBuffer, 0, receiveBuffer.Length);

message.AppendFormat("{0}", Encoding.ASCII.GetString(receiveBuffer, 0, numberOfBytesRead));

} while (stream.DataAvailable);

string response = message.ToString();

//Console.WriteLine("Response: \n" + response);
response = response.Substring(response.IndexOf("\r\n\r\n"));
dynamic jsonData = JsonConvert.DeserializeObject(response);
List<Drink> drankjes = new List<Drink>();

for (int i = 0; i < jsonData.drinks.Count; i++)

string id = jsonData.drinks[i].idDrink;
string drink = jsonData.drinks[i].strDrink;
string category = jsonData.drinks[i].strCategory;
string instructions = jsonData.drinks[i].strInstructions;
string glass = jsonData.drinks[i].strGlass;
var d = new Drink(id, drink, category, instructions);

catch (Exception)

catch (Exception e)


//Console.WriteLine(jsonData.drinks.Count); get ammount of drinks.

private static string getRequestCoctail(string coctail)

return $"GET /api/json/v1/1/search.php?s=godfather HTTP/1.1\r\n"
+ "Host:\r\n\r\n";

private static string GetMetaDataCocktail(dynamic jsonData)

dynamic drink = jsonData.drinks[0];
return $"DrinkID : {drink.idDrink} \nDrinkName : {drink.strDrink} \nInstructions : {drink.strInstructions}";

private static Drink GenerateNewDrink(dynamic jsonData)
Console.WriteLine(jsonData.idDrink, jsonData.strDrink, jsonData.strCategory, jsonData.strInstructions);
return new Drink(jsonData.idDrink, jsonData.strDrink, jsonData.strCategory, "", jsonData.strInstructions);


edit :

I added the drink class :

class Drink
public readonly string drinkId;
public readonly string strDrink;
public readonly string strCategory;
public readonly string strInstructions;
public readonly string strGlass;

public Drink(string drinkId, string strDrink, string strCategory, string strInstructions)
this.drinkId = drinkId;
this.strDrink = strDrink;
this.strCategory = strCategory;
this.strInstructions = strInstructions;

public Drink(string drinkId, string strDrink, string strCategory, string strGlass, string strInstructions)
this.drinkId = drinkId;
this.strDrink = strDrink;
this.strCategory = strCategory;
this.strGlass = strGlass;
this.strInstructions = strInstructions;

I tried it with :

it went good for 5 times, then i got this error + the json i recieved.
the 6th time was fine aswell. (Better format then the paste below)

Unexpected end when deserializing object. Path 'drinks[1].strIngredient1', line 3, position 1243.

"strCategory":"Ordinary Drink",
"strGlass":"Old-fashioned glass",
"strInstructions":"Pour ingredients into an old-fashioned glass over ice and serve. (Bourbon may be substituted for scotch, if preferred.)",
"strMeasure1":"1 1\/2 oz ",
"strMeasure2":"3\/4 oz ",
"strMeasure3":" ",
"strMeasure4":" ",
"strMeasure5":" ",
"strMeasure6":" ",
"strMeasure7":" ",
"strDrink":"J. R.'s Godfather",
"strCategory":"Ordinary Drink",
"strGlass":"Old-fashioned glass",
"strInstructions":"In an old-fashioned glass almost filled with ice cubes, combine both of the ingredients. Stir to mix the flavors.",

I understand why it goes wrong right now, the JSON is invalid ofcourse, but this is the response I recieved. So the code I am using to get the response is wrong.. right?

edit 3:

same request, good JSON response :

Now the program works, but it is incosistent.

Answer Source

I guess the actual problem is you're not evaluating the HTTP response headers.

The result is most likely sent in batches, i.e. the transfer encoding is "chunked", but your naive reader will only get the very first chunk and use that, rather than waiting for more. This might change between requests (e.g. chunked on direct delivery, non-chunked once cached or vice-versa). So in the end, don't reinvent the wheel, just use WebClient.

Read up the RFC section 3.6.1:

3.6.1 Chunked Transfer Coding

The chunked encoding modifies the body of a message in order to transfer it as a series of chunks, each with its own size indicator, followed by an OPTIONAL trailer containing entity-header fields. This allows dynamically produced content to be transferred along with the information necessary for the recipient to verify that it has received the full message.

When you're encountering an issue like this, try to split your code into smaller parts and check to see whether these parts deliver the expected results.

In your case, your HTTP download clearly appears to be incomplete, so you can't really blame the JSON parser for spitting out errors (because they're valid).