Click here to Skip to main content
15,888,351 members
Please Sign up or sign in to vote.
2.00/5 (1 vote)
See more:
Hi Experts,
I managed to get json file using HttpWebRequest.
And I used JSON.net to convert json file to Datatable.
when trying to convert it give me the following error:
C#
Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path '', line 1, position 1.


Here's my c# code:
C#
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://abc.com/makes.json");
            httpWebRequest.Method = WebRequestMethods.Http.Get;
            httpWebRequest.Accept = "application/json; charset=utf-8";
            string file;
            var response=(HttpWebResponse)httpWebRequest.GetResponse();
            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                file = sr.ReadToEnd();
            }

            //var json = JObject.Parse(file);
            var table = JsonConvert.DeserializeObject<DataTable>(file);
            if (table.Rows.Count > 0)
            { 
                //do something 
            }

here is how the file looks like:
C#
{"makes":[{"makeid":21,"name":"Acura"},{"makeid":250,"name":"AM GENERAL"},{"makeid":5,"name":"Audi"},{"makeid":239,"name":"BMW"},{"makeid":65,"name":"Buick"},{"makeid":66,"name":"Cadillac"},{"makeid":1,"name":"Chevrolet"},{"makeid":10,"name":"Chrysler"},{"makeid":9,"name":"Dodge"},{"makeid":2,"name":"Ford"},{"makeid":11,"name":"GMC"},{"makeid":13,"name":"Honda"},{"makeid":117,"name":"Hummer"},{"makeid":19,"name":"Hyundai"},{"makeid":123,"name":"Infiniti"},{"makeid":240,"name":"Isuzu"},{"makeid":242,"name":"Jaguar"},{"makeid":130,"name":"Jeep"},{"makeid":18,"name":"Kia"},{"makeid":321,"name":"Lada"},{"makeid":244,"name":"Land Rover"},{"makeid":143,"name":"Lexus"},{"makeid":144,"name":"Lincoln"},{"makeid":15,"name":"Mazda"},{"makeid":245,"name":"Mercedes-Benz"},{"makeid":152,"name":"Mercury"},{"makeid":241,"name":"Mini"},{"makeid":158,"name":"Mitsubishi"},{"makeid":14,"name":"Nissan"},{"makeid":167,"name":"Oldsmobile"},{"makeid":281,"name":"Opel"},{"makeid":180,"name":"Plymouth"},{"makeid":181,"name":"Pontiac"},{"makeid":17,"name":"Porsche"},{"makeid":311,"name":"RAM"},{"makeid":331,"name":"Renault"},{"makeid":238,"name":"Saab"},{"makeid":12,"name":"Saturn"},{"makeid":243,"name":"Scion"},{"makeid":202,"name":"Subaru"},{"makeid":204,"name":"Suzuki"},{"makeid":209,"name":"Toyota"},{"makeid":16,"name":"Volkswagen"},{"makeid":6,"name":"Volvo"},{"makeid":301,"name":"VPG"}]}

But when giving this format (manually) it works!
C#
file= "[    {      \"makeid\": 21,      \"name\": \"Acura\"    },    {      \"makeid\": 250,      \"name\": \"AM GENERAL\"    },    {      \"makeid\": 5,      \"name\": \"Audi\"    },    {      \"makeid\": 239,      \"name\": \"BMW\"    },    {      \"makeid\": 65,      \"name\": \"Buick\"    },    {      \"makeid\": 66,      \"name\": \"Cadillac\"    },    {      \"makeid\": 1,      \"name\": \"Chevrolet\"    },    {      \"makeid\": 10,      \"name\": \"Chrysler\"    },    {      \"makeid\": 9,      \"name\": \"Dodge\"    },    {      \"makeid\": 2,      \"name\": \"Ford\"    },    {      \"makeid\": 11,      \"name\": \"GMC\"    },    {      \"makeid\": 13,      \"name\": \"Honda\"    },    {      \"makeid\": 117,      \"name\": \"Hummer\"    },    {      \"makeid\": 19,      \"name\": \"Hyundai\"    },    {      \"makeid\": 123,      \"name\": \"Infiniti\"    },    {      \"makeid\": 240,      \"name\": \"Isuzu\"    },    {      \"makeid\": 242,      \"name\": \"Jaguar\"    },    {      \"makeid\": 130,      \"name\": \"Jeep\"    },    {      \"makeid\": 18,      \"name\": \"Kia\"    },    {      \"makeid\": 321,      \"name\": \"Lada\"    },    {      \"makeid\": 244,      \"name\": \"Land Rover\"    },    {      \"makeid\": 143,      \"name\": \"Lexus\"    },    {      \"makeid\": 144,      \"name\": \"Lincoln\"    },    {      \"makeid\": 15,      \"name\": \"Mazda\"    },    {      \"makeid\": 245,      \"name\": \"Mercedes-Benz\"    },    {      \"makeid\": 152,      \"name\": \"Mercury\"    },    {      \"makeid\": 241,      \"name\": \"Mini\"    },    {      \"makeid\": 158,      \"name\": \"Mitsubishi\"    },    {      \"makeid\": 14,      \"name\": \"Nissan\"    },    {      \"makeid\": 167,      \"name\": \"Oldsmobile\"    },    {      \"makeid\": 281,      \"name\": \"Opel\"    },    {      \"makeid\": 180,      \"name\": \"Plymouth\"    },    {      \"makeid\": 181,      \"name\": \"Pontiac\"    },    {      \"makeid\": 17,      \"name\": \"Porsche\"    },    {      \"makeid\": 311,      \"name\": \"RAM\"    },    {      \"makeid\": 331,      \"name\": \"Renault\"    },    {      \"makeid\": 238,      \"name\": \"Saab\"    },    {      \"makeid\": 12,      \"name\": \"Saturn\"    },    {      \"makeid\": 243,      \"name\": \"Scion\"    },    {      \"makeid\": 202,      \"name\": \"Subaru\"    },    {      \"makeid\": 204,      \"name\": \"Suzuki\"    },    {      \"makeid\": 209,      \"name\": \"Toyota\"    },    {      \"makeid\": 16,      \"name\": \"Volkswagen\"    },    {      \"makeid\": 6,      \"name\": \"Volvo\"    },    {      \"makeid\": 301,      \"name\": \"VPG\"    }  ]";


please advise what's wrong with my code. I can't do it manually everytime. i need to read json files from url then convert them to datatables to be saved to DB.

thanks
Samira
Posted

1 solution

Assuming the JSON you're receiving always looks the same, use the DeserializeAnonymousType method[^]:
C#
var table = JsonConvert.DeserializeAnonymousType(file, new { Makes = default(DataTable) }).Makes;
 
Share this answer
 
Comments
Samira Radwan 2-Dec-15 16:30pm    
thanks a lot saved me a lot of time :)
BillWoodruff 2-Dec-15 23:10pm    
+5 Wow ! Never heard of the Newton method before; wonder if MS JSON, or Mehdi Gholam's JSON would have either a similar problem, or a similar method (that's not to imply I understand what the OP's problem is!).

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900