我正在寻找一些帮助将数据表转换为JObject。我在visual studio中使用C#
以及Newtonsoft JSON .net
库。我从我的数据库中检索了我的数据表。
从这里我拿了数据表并通过这个类进行处理:
public string DataTableToJSONString(DataTable table)
{
string JSONString = string.Empty;
JSONString = JsonConvert.SerializeObject(table,Formatting.Indented);
return JSONString;
}
现在,对象已经通过JSONString
库成功转换为Newtonsoft JSON.net
(此时不会抛出任何错误),我无法将其解析为JObject
这段代码:
注意:" json"是字符串变量我将DatatabletoDataTableToJSONString()方法返回的值放入..
JObject job = JObject.Parse(json);
我不断收到以下错误......
Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.
我需要以JObject
的形式将其传递给API的以下post方法:
public static async Task<JObject> Post(string url, JObject data)
{
// Create an HttpClient instance
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = CreateBasicHeader(ClientContext.Username, ClientContext.Password);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Send a request asynchronously and continue when complete
var requestbody = new StringContent(data.ToString(), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(url, requestbody);
dynamic content = await response.Content.ReadAsAsync<JObject>();
// Check that response was successful or throw exception
try
{
response.EnsureSuccessStatusCode();
}
catch (Exception ex)
{
throw new Exception("Status Code: " + response.StatusCode + "\r\nMessage: " + content[0].ToString(), ex);
}
// Read response asynchronously as a JObject
return content;
}
我很感激任何帮助,因为我已经研究了2周而没有运气。这个真的杀了我。提前感谢所有花时间研究这个问题的人。
更新:我最后添加了下面的代码,因为当我拉出数据表时,我意识到我正在返回一个数组。
string jsonresult = JsonConvert.SerializeObject(dt);
JArray aray = JArray.Parse(jsonresult);
//然后我在这里获得了API登录凭据的代码....
foreach (JObject item in aray)
{
ApiClient.Post(Url, item).Wait();
}
这似乎很好地传入了JObjects到post方法,虽然我收到以下错误:&#34; AggregateException未处理...&#34;我设置了一个断点,这个缺陷似乎发生在:
try
{
response.EnsureSuccessStatusCode();
}
尝试response.ensuresuccessstatusCode();该计划当然会跳到捕获......
catch (Exception ex)
{
throw new Exception("Status Code: " + response.StatusCode + "\r\nMessage: " + content.message.ToString(), ex);
}
再次,任何帮助将不胜感激。我几乎就在那里。发布后,我将完成....再次感谢大家。我为长篇大论而道歉。
答案 0 :(得分:0)
您的问题是JSON有两种类型的容器:数组和对象:
对象是一组无序的名称/值对。对象以{(左括号)开头,以}结尾(右大括号)。
相应的LINQ to JSON课程为JObject
。
数组是有序的值集合。数组以[(左括号)开头,以]结尾(右括号)。值以(逗号)分隔。
相应的LINQ to JSON类是JArray
。
那么,Json.NET如何序列化数据表?从文档Serialize a DataSet中,我们可以看到每个表都被序列化为一个数组。
如果尝试将根对象为数组的JSON字符串解析为JObject
,则会出现此异常。
相反,您必须返回JArray
,或者更好的是JToken
,这是所有JSON实体的根类:
public static async Task<JToken> Post(string url, JObject data)
{
// Create an HttpClient instance
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = CreateBasicHeader(ClientContext.Username, ClientContext.Password);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Send a request asynchronously and continue when complete
var requestbody = new StringContent(data.ToString(), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(url, requestbody);
dynamic content = await response.Content.ReadAsAsync<JToken>();
// Check that response was successful or throw exception
try
{
response.EnsureSuccessStatusCode();
}
catch (Exception ex)
{
throw new Exception("Status Code: " + response.StatusCode + "\r\nMessage: " + content[0].ToString(), ex);
}
// Read response asynchronously as a JToken
return content;
}
答案 1 :(得分:0)
我正在回答这个问题并将其关闭,因为原始问题在技术上得到了回答。我只是使用以下代码将JArray转换为其各自的JObject。
foreach(aray中的JObject项) { ApiClient.Post(Url,item).Wait(); }
虽然我仍在进行调试,但我在技术上能够将Object从数据表中提取出来。
全部谢谢!!!!!