【问题标题】:Convert to JSON Array, not regular object转换为 JSON 数组,而不是常规对象
【发布时间】:2014-11-19 22:30:12
【问题描述】:

我已使用此实用程序http://www.convertcsv.com/csv-to-json.htm 来格式化数据表。它具有允许您转换为 JSON 或 JSON 数组的绝佳选项。那个 JSON 数组就是我想要的。当我使用 JSON.Net 等实用程序进行序列化时,它们为我提供了标准的 JSON 格式。我不想要那个 - 我只想要数组,所以我基本上可以在我的 javascript 中重现表格布局。

这里是示例表数据结构

column1 column2 column3
c1r1    c2r1    c3r1
c1r2    c2r2    c3r2
c1r3    c2r3    c3r3

我希望它在序列化时看起来像这样:

[[c1r1,c2r1,c3r1],
 [c1r2,c2r2,c3r2],
 [c1r3,c2r3,c3r3]]

但是像 JSON.net 这样的实用工具的标准序列化方法是

[
  {
    column1:c1r1,
    column2:c2r1,
    column3:c3r1
  },
  {
    column1:c1r2,
    column2:c2r2,
    column3:c3r2
  },
  {
    column1:c1r3,
    column2:c2r3,
    column3:c3r3
  }
]

我的问题是,有没有人知道一种去除列名并使其像我展示的简单二维数组一样的方法?

数据结构是直接取自 sql 命令db.Query("SELECT * FROM my_table")IEnumerable

注意:我希望有一个通用函数可以做到这一点——我知道如何只为一件事做到这一点,但我正在从事的项目需要以同样的方式为许多人完成。我尝试编写自己的方法来执行此操作,但由于 c# 的限制,它不起作用。

    public static string fromListToJSONArray(IEnumerable<Object> listToUse, string[] fieldNames)
    {
        string JSONString = "[";
        foreach (var item in listToUse)
        {
            JSONString += item[fieldName[0]]; //This is the line you can't do in c#!!  Don't know how to go around this.
        }
        JSONString += "]";
        return JSONString;
    }

【问题讨论】:

  • 你认为 C# 不能做什么?你得到一个编译器错误吗?告诉我们哪个错误。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 在 javascript 中,如果你有一个变量 spaceship,你可以访问属性 "x",比如 c# spaceship.x 或 spaceship["x"] 中的 c# spaceship["x"] 不起作用 - 我试过了枚举,但得到一个错误,即有一个 nil 值。
  • 在 C# 中,您可以使用 Reflection 执行此操作,甚至更多。您当然可以处理任意对象的所有属性。它只是不使用与 JavaScript 相同的语法。
  • 我试过了,但我遇到了麻烦。 JSONString += item.GetType().GetProperty(fieldName).GetValue(item, null); 其中itemIEnumerable&lt;Object&gt; 中的一行 引发空引用异常。你知道那会是什么吗? item 变量在调试器中不为空。我认为这对我来说确实是最好的解决方案,但我无法让它发挥作用。

标签: c# asp.net json serialization


【解决方案1】:

您要输出的是数组数组。从一个可枚举或记录开始(在您的情况下,它看起来有名为 column1、column2、column3 的列)。

如果查询将生成已知结果集,您可以在转换为 JSON 之前将每一行简单地转换为数组。

var qry = /*Enumerable of some database query*/
return from rec in wry
    select new string[] 
    {
      rec.column1, 
      rec.column2, 
      rec.column3
    };

【讨论】:

  • 如果您希望它是通用的,那么您将需要使用反射来获取 rec 对象上的每个属性,或者使用数据适配器来填充 DataTable(使用 DataAdapter 或 Data Reader 可以检索列元素)。
  • 谢谢 bigtlb,我会调查这些
  • 我会选择DataReader,除非您需要知道列名。这些列只是一个基于 0 的数组。您可以尝试将它们读取为字符串。
【解决方案2】:

我想你问的问题类似于this

您必须从 json 手动组装数组。

【讨论】:

    【解决方案3】:

    我找到了解决方案 - IEnumerable 类型需要是“动态的”。从那里开始很简单

    public static string fromListToJSONArray(IEnumerable<dynamic> listToUse)
        {
            string JSONString = "[";
            foreach (var item in listToUse)
            {
                if(isFirst == false)
                    JSONString += ",";
                else
                    isFirst = false;
                JSONString += "\"" + item[0] + "\"";
            }
            JSONString += "]";
            return JSONString;
            JSONString += "]";
            return JSONString;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多