【问题标题】:How to Convert Json String into DataTable in ASP.Net with C#如何使用 C# 在 ASP.Net 中将 Json 字符串转换为 DataTable
【发布时间】:2016-02-18 13:18:25
【问题描述】:

我正在使用this API。它根据用户输入给出 json 输出。例如:

{
"apple.com":{"status":"regthroughothers","classkey":"domcno"},
"asdfgqwx.com":{"status":"available","classkey":"domcno"},
"microsoft.org":{"status":"unknown"},
"apple.org":{"status":"unknown"},
"microsoft.com":{"status":"regthroughothers","classkey":"domcno"},
"asdfgqwx.org":{"status":"unknown"}
}

现在我想在 dataTable 中更改这个 json 输出,然后在 Gridview 和中继器等数据控件中绑定。

我正在使用this method 执行此操作,但是当我在此方法中传递上述 json 输出时,它会引发错误

读取 DataTable 时出现意外的 JSON 令牌。预期 StartArray,得到 StartObject。路径'',第 1 行,位置 1。

【问题讨论】:

  • 将您的 jsonstring 反序列化为某个类 List myList = JsonConvert.DeserializeObject>(jsonString);然后使用该列表创建新的数据表
  • 这也更快:DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));
  • 对不起!!我无法理解。你能在这里详细写一些代码吗? bcoz 我已经用过这段代码“DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));”
  • DataTable 是一个不好的选择。您最好创建一个模型,该模型是一个表示来自 JSON 的数据的 .NET 对象。 GridView 和Repeater 都支持绑定到任何实现IEnumerable 的东西。这使它更容易使用。但是,您的 JSON 是一种奇怪的格式,而代表它的正确 C# 类目前让我无法理解。

标签: c# asp.net datatable json-api


【解决方案1】:

要转换为DataTable,您必须了解您在做什么:

DataTable 表示 rowscolumns 的集合,您的 JSON 字符串必须表示可以通过转换为 rows 的集合的集合和

这是正确的 JSON 文件示例,可以更改为 DataTable:

[{
    "column1": "1788",
    "column2": "19"
},
{
    "column1": "1789",
    "column2": "24"
},
{
    "column1": "1790",
    "column2": "24"
},
{
    "column1": "1790",
    "column2": "23"
},
{
    "column1": "1790",
    "column2": "21"
}]

column1column2 的每一对都是行

现在你的 JSON 不好。我将其更改为:(正确的DataTable 架构)

  [{
        "name": "apple.com",
        "status": "regthroughothers",
        "classkey": "domcno"
    },
    {
        "name": "asdfgqwx.com",
        "status": "available",
        "classkey": "domcno"
    },
    {
        "name": "microsoft.org",
        "status": "unknown",
        "classkey": ""
    },
    {
        "name": "apple.org",
        "status": "unknown",
        "classkey": ""
    },
    {
        "name": "microsoft.com",
        "status": "regthroughothers",
        "classkey": "domcno"
    },
    {
        "name": "asdfgqwx.org",
        "status": "unknown",
        "classkey": "domcno"
    }]

我在数组的开头和结尾添加[符号和]符号

下一步你可以这样做。这是将上述 JSON 字符串反序列化为 DataTable

的工作示例
using Newtonsoft.Json;

public class JsonExample
    {

        private string jsonObject = "[{ \"name\": \"apple.com\",    \"status\": \"regthroughothers\",   \"classkey\": \"domcno\"},{ \"name\": \"asdfgqwx.com\", \"status\": \"available\",  \"classkey\": \"domcno\"},{ \"name\": \"microsoft.org\",    \"status\": \"unknown\",    \"classkey\": \"\"},{   \"name\": \"apple.org\",    \"status\": \"unknown\",    \"classkey\": \"\"},{   \"name\": \"microsoft.com\",    \"status\": \"regthroughothers\",   \"classkey\": \"domcno\"},{ \"name\": \"asdfgqwx.org\", \"status\": \"unknown\",    \"classkey\": \"domcno\"}]".Trim();

        public JsonExample()
        { 
            DataTable items = JsonConvert.DeserializeObject<DataTable>(jsonObject);

            foreach (DataRow item in items.Rows)
            {
                Console.WriteLine($"Name: {item[0]} Status: {item[1]}  classkey {item[2]} " );
            }

        }
    }

但是如果你不想更改 JSON 文件

private string jsonObject = JSON_String.Replace("{", "[{").Replace("}", "}]");

public JsonExample()
        {
            JArray jArray = JArray.Parse(jsonObject);

            DataTable dt = new DataTable();

            dt.Columns.Add("Name");
            dt.Columns.Add("status");
            dt.Columns.Add("classkey");

            foreach (JProperty item in jArray[0])
            {
                var jArray2 = JArray.Parse(item.Value.ToString());

                foreach (var item2 in jArray2)
                {
                    dt.Rows.Add(item.Name, item2["status"], item2["classkey"]);
                    Console.WriteLine($"Name: {item.Name} Status: {item2["status"]}  classkey {item2["classkey"]} ");
                }
            } 
        }

效果相同,但您不需要更改 JSON 字符串 exept 2 替换。

用我写的方法解析第一个字符串时的效果:

附加信息:

Convert JSON response to DataTable

【讨论】:

  • 改变它的生成方式,goldeinsten 是正确的。您收到的错误意味着 json 无法解析,甚至无法开始解析,因为它位于第 1 行 pos 1。我想说您的 json 生成与实际的数据表实现相比是错误的。
  • @user3786581 好的,我明白了。我更新我的答案来做到这一点
  • @goodeinstein 请注意,这是asked before,OP 实际上是在询问如何在 ASP.NET 中显示数据。根本不需要将数据转换为 DataTable。虽然 BoundFields 只能绑定到直接属性,但 Template 字段可以绑定到嵌套属性,允许您直接绑定到嵌套的 statusclasskey 属性
  • 谢谢,我明白了,但是从昨天开始,我想以正确的方式回答这个问题,我对 JSON.NET 了解很多,今天我发现了如何使用 JArray 对象:)
  • 感谢你们所有人...特别是@goodeinstein。终于我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2015-06-16
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多