将JSON字符串从数据表转换为JObject c#

时间:2016-01-11 18:57:11

标签: json api post json.net

我正在寻找一些帮助将数据表转换为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);
        }

再次,任何帮助将不胜感激。我几乎就在那里。发布后,我将完成....再次感谢大家。我为长篇大论而道歉。

2 个答案:

答案 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从数据表中提取出来。

全部谢谢!!!!!