将JSON字符串从datatable转换为JObject c#

将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

我正在寻找一些关于将datatable转换为JObject的帮助。我正在visual studio中使用
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类为

那么,Json.NET如何序列化数据表呢?从文档中,我们可以看到每个表都被序列化为一个数组

如果试图将根对象为数组的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类为

那么,Json.NET如何序列化数据表呢?从文档中,我们可以看到每个表都被序列化为一个数组

如果试图将根对象为数组的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(); }

尽管我仍在进行调试,但从技术上讲,我能够从数据表中获取的数组中提取对象


谢谢大家

我正在回答这个问题,并结束它,因为原来的问题已经结束了