我面临的问题是反序列化每次都不起作用,即使我发出相同的请求.我不知道如何修复它,因为try.catch没有做任何更好的事情.
此外,当我试图解析一个非常大的响应(20个json对象)时,程序永远不会工作.
Unterminated string. Expected delimiter: “. Path ‘drinks[0].strMeasure4’,line 3,position 720.
是我得到的错误之一,它永远不会是一样的.
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("www.thecocktaildb.com",80); // geen http string request = getRequestCoctail("margarita"); NetworkStream stream = client.GetStream(); byte[] buffer = Encoding.Default.GetBytes(request); stream.Write(buffer,buffer.Length); StringBuilder message = new StringBuilder(); int numberOfBytesRead = 0; byte[] receiveBuffer = new byte[1024]; do { numberOfBytesRead = stream.Read(receiveBuffer,receiveBuffer.Length); message.AppendFormat("{0}",Encoding.ASCII.GetString(receiveBuffer,numberOfBytesRead)); } while (stream.DataAvailable); string response = message.ToString(); //Console.WriteLine("Response: \n" + response); response = response.Substring(response.IndexOf("\r\n\r\n")); try { dynamic jsonData = JsonConvert.DeserializeObject(response); List<Drink> drankjes = new List<Drink>(); for (int i = 0; i < jsonData.drinks.Count; i++) { try { 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; Console.WriteLine(glass); var d = new Drink(id,drink,category,instructions); drankjes.Add(d); } catch (Exception) { Console.WriteLine("error"); } } } catch (Exception e) { Console.WriteLine(e.Message); } //Console.WriteLine(jsonData.drinks.Count); //Console.WriteLine(jsonData.drinks.Count); get ammount of drinks. Console.ReadKey(); } //www.thecocktaildb.com/api/json/v1/1/lookup.PHP?i=15679 private static string getRequestCoctail(string coctail) { ///api/json/v1/1/search.PHP?s=margarita return $"GET /api/json/v1/1/search.PHP?s=godfather HTTP/1.1\r\n" + "Host: www.thecocktaildb.com\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.strInstructions); } } }
编辑:
我添加了饮料类:
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 strGlass,string strInstructions) { this.drinkId = drinkId; this.strDrink = strDrink; this.strCategory = strCategory; this.strGlass = strGlass; this.strInstructions = strInstructions; } } }
我尝试过:
http://www.thecocktaildb.com/api/json/v1/1/search.php?s=godfather
它好了5次,然后我得到了这个错误我收到的json.
第6次也很好.
http://pastebin.com/c0d29L0S(更好的格式,然后下面的粘贴)
反序列化对象时意外结束.路径’饮料[1] .strIngredient1′,第3行,第1243位.
{"drinks":[ {"idDrink":"11423","strDrink":"Godfather","strCategory":"Ordinary Drink","strAlcoholic":"Alcoholic","strGlass":"Old-fashioned glass","strInstructions":"Pour ingredients into an old-fashioned glass over ice and serve. (Bourbon may be substituted for scotch,if preferred.)","strDrinkThumb":null,"strIngredient1":"Scotch","strIngredient2":"Amaretto","strIngredient3":"","strIngredient4":"","strIngredient5":"","strIngredient6":"","strIngredient7":"","strIngredient8":"","strIngredient9":"","strIngredient10":"","strIngredient11":"","strIngredient12":"","strIngredient13":"","strIngredient14":"","strIngredient15":"","strMeasure1":"1 1\/2 oz ","strMeasure2":"3\/4 oz ","strMeasure3":" ","strMeasure4":" ","strMeasure5":" ","strMeasure6":" ","strMeasure7":" ","strMeasure8":"","strMeasure9":"","strMeasure10":"","strMeasure11":"","strMeasure12":"","strMeasure13":"","strMeasure14":"","strMeasure15":"","dateModified":null },{"idDrink":"11538","strDrink":"J. R.'s Godfather","strInstructions":"In an old-fashioned glass almost filled with ice cubes,combine both of the ingredients. Stir to mix the flavors.","strIngredient1":
我理解为什么它现在出错,JSON无效,但这是我收到的回复.所以我用来获得响应的代码是错的..对吧?
编辑3:
相同的请求,良好的JSON响应:
现在该程序可以运行,但它是不存在的.
解决方法
结果很可能是批量发送的,即转移编码是“分块”的,但是你天真的读者只能获得第一个块并使用它,而不是等待更多.这可能会在请求之间发生变化(例如,在直接传递时分块,在缓存后不分块,反之亦然).所以最后,不要重新发明轮子,只需使用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.
当您遇到这样的问题时,请尝试将代码拆分为较小的部分,然后检查这些部分是否能够提供预期的结果.
在您的情况下,您的HTTP下载显然似乎不完整,因此您不能真正责怪JSON解析器吐出错误(因为它们是有效的).