【问题标题】:How to serialize sql data without the column names?如何在没有列名的情况下序列化 sql 数据?
【发布时间】:2019-07-17 02:16:30
【问题描述】:

我正在将数据从 SQL 数据库序列化为 JSON,我如何仅序列化没有字符串名称的值或在反序列化之前修剪序列化 JSON 的函数。

我阅读了有关 ScriptIgnoreAttribute 的信息,但没有看到如何将它与我想做的事情联系起来

原始 JSON

​[
    {
        "CODE": "AF",
        "TOTALVALUE": "$23,554,857.27"
    },
    {
        "CODE": "AS",
        "TOTALVALUE": "$38,379,964.65"
    },
    {
        "CODE": "SG",
        "TOTALVALUE": "$24,134,283.47"
    }
]

所需的 JSON

​[
    {
        "AF": "$23,554,857.27"
    },
    {
        "AS": "$38,379,964.65"
    },
    {
        "SG": "$24,134,283.47"
    }
]

SQL 视图结构

My SQL 查询返回数据

SELECT [CODE],[TOTALVALUE] FROM [dbo].[vw_BuyersByCountryValue]
enter code here

ASP.NET 中的序列化代码

[WebMethod]
    public void GetBuyersByCountryValue()
    {

        using (PMMCEntities ctx = new PMMCEntities())
        {
            ctx.Configuration.ProxyCreationEnabled = false;
            var qry = ctx.vw_BuyersByCountryValue.ToList();

            var js = new JavaScriptSerializer();
            string strResponse = js.Serialize(qry);
            Context.Response.Clear();
            Context.Response.ContentType = "application/json";
            Context.Response.AddHeader("content-length", strResponse.Length.ToString(CultureInfo.InvariantCulture));
            Context.Response.Flush();
            Context.Response.Write(strResponse);
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
    }

【问题讨论】:

  • 请添加代码。请参阅:minimal reproducible example
  • 这篇文章的标题包含“忽略”这个词。如果这不是你的意图,我建议纠正它以吸引更好的答案
  • 我的 2c 建议在这里 - JavaScriptSerializer 除了编写自定义 JavaScriptConverter 之外,无法重命名用于序列化的属性。这个序列化器非常简单;它支持的唯一序列化属性是 ScriptIgnore,用于抑制属性的序列化。尝试其他库以获得您想要的。
  • 请分享用于获取数据的 SQL 脚本。它可以在转换为 JSON 之前进行转换。

标签: c# asp.net json sql-server-2012


【解决方案1】:

很简单

// data from the query 
// SELECT CODE, TOTALVALUE FROM vw_BuyersByCountryValue
var sqldata = new [] 
{ 
    new { Code = "AF", TotalValue = "$23,554,857.27" },  
    new { Code = "AS", TotalValue = "$38,379,964.65" },  
    new { Code = "SG", TotalValue = "$24,134,283.47" },  
};

var mappeddata = sqldata.Select( r => 
{
    var dict = new Dictionary<string,string>();
    dict[r.Code] = r.TotalValue;
    return dict;
});

var json = JsonConvert.SerializeObject(mappeddata,Formatting.Indented);

json的内容

[
  {
    "AF": "$23,554,857.27"
  },
  {
    "AS": "$38,379,964.65"
  },
  {
    "SG": "$24,134,283.47"
  }
]

.net fiddle sample


您甚至可以将其填充为

{
  "AF": "$23,554,857.27",
  "AS": "$38,379,964.65",
  "SG": "$24,134,283.47"
}

var sqldata = new [] 
{ 
    new { Code = "AF", TotalValue = "$23,554,857.27" },  
    new { Code = "AS", TotalValue = "$38,379,964.65" },  
    new { Code = "SG", TotalValue = "$24,134,283.47" },  
};

var mappeddata = sqldata.ToDictionary(r => r.Code, r => r.TotalValue);
var json = JsonConvert.SerializeObject(mappeddata,Formatting.Indented);

.net fiddle sample


更新

[WebMethod]
public void GetBuyersByCountryValue()
{
    using (PMMCEntities ctx = new PMMCEntities())
    {
        ctx.Configuration.ProxyCreationEnabled = false;
        var qry = ctx.vw_BuyersByCountryValue.ToList();

        var mapped = qry.Select r => 
        {
            var dict = new Dictionary<string,string>();
            dict[r.CODE] = r.TOTALVALUE;
            return dict;
        });

        string strResponse = Newtonsoft.Json.JsonConvert.SerializeObject(mapped);

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-length", strResponse.Length.ToString(CultureInfo.InvariantCulture));
        Context.Response.Flush();
        Context.Response.Write(strResponse);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
}

您需要 NuGet 包 Newtonsoft.Json

【讨论】:

  • 感谢 Rufo 爵士,但我直接从数据库加载数据,而不是像您共享的那样手动创建数据。谢谢
  • 抱歉,我没有使用您的所有数据设置 SQL Server。从查询中逐行读取数据并将其填充到字典中真的有问题吗?
  • 是的 Rufo 先生,我遇到了问题,因为 sql 的结果作为列表返回
  • 当你有一个列表时,你就可以迭代了。当你可以迭代时,你可以填充字典
  • @MichaelMarmah 我修改了你的代码应该是怎样的 - 但我不确定属性 CODE 和 TOTALVALUE ,我不得不猜测,因为你没有发布类定义。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2012-05-07
  • 2012-02-11
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多