【问题标题】:convert json array to datatable asp.net将 json 数组转换为数据表 asp.net
【发布时间】:2017-02-16 16:40:27
【问题描述】:

请我对 json 很陌生。我有一个传递值的 url,返回的数据是 json。我需要从这个 url 反序列化 json,然后将它绑定到 asp.net 中的列表视图控件。这是json数据的样子。

   {"records":[{"record":{"Ch_ID":"27","User_id":"1","Ch_Name":"test1","Ch_Description":"test1description","Ch_Starttime":""}},{"record":{"Ch_ID":"29","User_id":"1","Ch_Name":"w","Ch_Description":"ww","Ch_Starttime":"12"}},{"record":{"Ch_ID":"30","User_id":"1","Ch_Name":"qq","Ch_Description":"qqqdescription","Ch_Starttime":"1222"}},{"record":{"Ch_ID":"31","User_id":"1","Ch_Name":"v","Ch_Description":"vv","Ch_Starttime":"1"}},{"record":{"Ch_ID":"32","User_id":"1","Ch_Name":"n","Ch_Description":"nnnn","Ch_Starttime":"111"}}]} 

有没有人知道我可以如何做到这一点。我已经尝试过 json.net,但它给了我错误。

【问题讨论】:

  • 这是我得到的错误无法将当前 JSON 对象(例如 {"name":"value"}) 反序列化为类型 'wireframes.wcodes[]' 因为该类型需要 JSON 数组(例如 [1,2,3]) 以正确反序列化。
  • 欢迎来到 Stackoverflow。请您使用用于反序列化的 C# 更新您的问题。
  • 请包含您尝试过的导致错误的代码。

标签: c# asp.net json vb.net json.net


【解决方案1】:

Json.NET 确实支持通过其内置的 DataTableConverter 反序列化 DataTable,但它希望将 JSON 格式化为数组,如下所示:

[
  {
    "Ch_ID": "27",
    "User_id": "1",
    // Other fields
  },
  {
    "Ch_ID": "29",
    "User_id": "1",
    // Other fields
  },
  // Other records
]

您的 JSON 格式如下:

{
  "records": [
    {
      "record": {
        "Ch_ID": "27",
        "User_id": "1",
        // Other fields
      }
    },
    {
      "record": {
        "Ch_ID": "29",
        "User_id": "1",
        // Other fields
      }
    },
    // Other records
  ]
}

您可以使用custom JsonConverter 将您的实际 JSON 转换为 Json.NET 所需的格式:

public class RecordDataTableConverter : Newtonsoft.Json.Converters.DataTableConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        if (reader.TokenType == JsonToken.StartObject)
        {
            var token = JToken.Load(reader);
            token = new JArray(token.SelectTokens("records[*].record"));
            using (var subReader = token.CreateReader())
            {
                while (subReader.TokenType == JsonToken.None)
                    subReader.Read();
                return base.ReadJson(subReader, objectType, existingValue, serializer); // Use base class to convert
            }
        }
        else
        {
            return base.ReadJson(reader, objectType, existingValue, serializer);
        }
    }
}

并按如下方式使用:

var json = GetJson();

var settings = new JsonSerializerSettings
{
    Converters = new[] { new RecordDataTableConverter() },
};

var table = JsonConvert.DeserializeObject<DataTable>(json, settings);

示例fiddle

【讨论】:

  • 非常感谢,我刚试了一下,我得到了这个错误:读取数据表时出现意外的 JSON 令牌。预期 StartArray,得到 StartObject。路径'',第 1 行,位置 1。
  • @StanleyEkpunobi - 我用你提供的 json 对其进行了测试,它可以工作。请参阅fiddle。如果那不是您真正的 JSON,或者您没有使用答案中所示的转换器进行反序列化,那么请提供minimal reproducible example 来重现问题。
  • 好的,现在可以正常工作了,非常感谢。它正在将其转换为实际的 json 格式。那么如何将其反序列化为字符串或任何可以绑定到控件的数据类型。
  • @StanleyEkpunobi - 至于将DataTable 绑定到asp.net 中的列表视图,您可以尝试How to populate a listview from a datatable
猜你喜欢
  • 2020-08-08
  • 2017-01-24
  • 2012-08-12
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多