将JSON字符串从datatable转换为JObject c#
我正在寻找一些关于将datatable转换为JObject的帮助。我正在visual studio中使用将JSON字符串从datatable转换为JObject c#,json,api,post,json.net,Json,Api,Post,Json.net,我正在寻找一些关于将datatable转换为JObject的帮助。我正在visual studio中使用C以及Newtonsoft JSON.net库。我已从数据库中检索到数据表 从这里,我获取了数据表,并通过这个类对其进行了处理: public string DataTableToJSONString(DataTable table) { string JSONString = string.Empty; JSONString = JsonCon
C
以及Newtonsoft JSON.net
库。我已从数据库中检索到数据表
从这里,我获取了数据表,并通过这个类对其进行了处理:
public string DataTableToJSONString(DataTable table)
{
string JSONString = string.Empty;
JSONString = JsonConvert.SerializeObject(table,Formatting.Indented);
return JSONString;
}
现在,该对象已通过Newtonsoft JSON.net
库成功转换为JSONString
(此时不会抛出错误),我无法使用以下代码将其解析为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
it的形式传递给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;
}
//然后我在这里有API登录凭据的代码
foreach (JObject item in aray)
{
ApiClient.Post(Url, item).Wait();
}
虽然我得到以下错误:“AggregateException未处理…”我设置了一个断点,该缺陷似乎发生在以下位置:
try
{
response.EnsureSuccessStatusCode();
}
尝试响应后。EnsureAccessStatusCode();程序当然会跳转到捕获
catch (Exception ex)
{
throw new Exception("Status Code: " + response.StatusCode + "\r\nMessage: " + content.message.ToString(), ex);
}
再次感谢您的帮助。我几乎做到了。在它发布后,我将完成。。。。再次提前感谢大家。很抱歉我说的太多。您的问题是有两种类型的容器:数组和对象:
- 对象是一组无序的名称/值对。对象以{(左大括号)开始,以}(右大括号)结束 相应的类是
- 数组是值的有序集合。数组以[(左括号)开始,以](右括号)结束。值之间用(逗号)分隔 对应的LINQ to JSON类为
JObject
,则会出现此异常
相反,您必须返回一个JArray
,或者更好的是返回一个,它是所有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;
}
公共静态异步任务Post(字符串url、作业对象数据)
{
//创建一个HttpClient实例
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.Authorization=CreateBasicHeader(ClientContext.Username,ClientContext.Password);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
//异步发送请求,完成后继续
var requestbody=newstringcontent(data.ToString(),Encoding.UTF8,“application/json”);
HttpResponseMessage response=wait client.PostAsync(url,requestbody);
动态内容=等待响应.content.ReadAsAsync();
//检查响应是否成功或引发异常
尝试
{
response.EnsureSuccessStatusCode();
}
捕获(例外情况除外)
{
抛出新异常(“状态代码:+response.StatusCode+”\r\n消息:+content[0].ToString(),ex);
}
//以JToken异步读取响应
返回内容;
}
您的问题在于有两种类型的容器:数组和对象:
- 对象是一组无序的名称/值对。对象以{(左大括号)开始,以}(右大括号)结束 相应的类是
- 数组是值的有序集合。数组以[(左括号)开始,以](右括号)结束。值之间用(逗号)分隔 对应的LINQ to JSON类为
JObject
,则会出现此异常
相反,您必须返回一个JArray
,或者更好的是返回一个,它是所有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;
}
公共静态异步任务Post(字符串url、作业对象数据)
{
//创建一个HttpClient实例
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.Authorization=CreateBasicHeader(ClientContext.Username,ClientContext.Password);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
//异步发送请求,完成后继续
var requestbody=newstringcontent(data.ToString(),Encoding.UTF8,“application/json”);
HttpResponseMessage response=wait client.PostAsync(url,requestbody);
动态内容=等待响应.content.ReadAsAsync();
//检查响应是否成功或引发异常
尝试
{
response.EnsureSuccessStatusCode();
}
捕获(例外情况除外)
{
抛出新异常(“状态代码:+response.StatusCode+”\r\n消息:+content[0].ToString(),ex);
}
//以JToken异步读取响应
返回内容;
}
我正在回答这个问题,并将其结束,因为原始问题在技术上已经得到了回答。我只是用下面的代码将JArray转换成它各自的Jobject
foreach(aray中的作业项目)
{
Post(Url,item.Wait();
}
尽管我仍在进行调试,但从技术上讲,我能够从数据表中获取的数组中提取对象
谢谢大家 我正在回答这个问题,并结束它,因为原来的问题已经结束了