我有一个SQL Server Stored Proc,它使用FOR JSON返回json。如果我在SQL中调用proc,它将正确返回,并且可以使用jsonlint之类的东西来验证输出。但是,该proc是从.net API层调用的,并且当json太长时,它似乎会截断它从proc中获取的字符串,因此具有无效的json。如果减少返回的数据量,则会通过API获得有效的json字符串,但是如果超过一定数量的字符,则会将其截断。
proc的结果很好:
{"APIResult":[{"ID":200,"Status_Message":"Success","User_Message":"Success","OperatingCountries":[{"Country_Name":"Mexico","ISO_Alpha2":"MX","ISO_Alpha3":"MEX","UN_Code":"484","Legal_Age":18,"Default_Language":"es"},{"Country_Name":"United States of America","ISO_Alpha2":"US","ISO_Alpha3":"USA","UN_Code":"840","Legal_Age":21,"Default_Language":"en-us"}]}]}
但结果不是:
{"APIResult":[{"ID":200,"Status_Message":"Success","User_Message":"Success","OperatingCountries":[{"Country_Name":"Afghanistan","ISO_Alpha2":"AF","ISO_Alpha3":"AFG","UN_Code":"004","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Angola","ISO_Alpha2":"AO","ISO_Alpha3":"AGO","UN_Code":"024","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Albania","ISO_Alpha2":"AL","ISO_Alpha3":"ALB","UN_Code":"008","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Andorra","ISO_Alpha2":"AD","ISO_Alpha3":"AND","UN_Code":"020","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Argentina","ISO_Alpha2":"AR","ISO_Alpha3":"ARG","UN_Code":"032","Legal_Age":18,"Default_Language":"es"},{"Country_Name":"Armenia","ISO_Alpha2":"AM","ISO_Alpha3":"ARM","UN_Code":"051","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"American Samoa","ISO_Alpha2":"AS","ISO_Alpha3":"ASM","UN_Code":"016","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Antarctica","ISO_Alpha2":"AQ","ISO_Alpha3":"ATA","UN_Code":"010","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Antigua and Barbuda","ISO_Alpha2":"AG","ISO_Alpha3":"ATG","UN_Code":"028","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Australia","ISO_Alpha2":"AU","ISO_Alpha3":"AUS","UN_Code":"036","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Austria","ISO_Alpha2":"AT","ISO_Alpha3":"AUT","UN_Code":"040","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Azerbaijan","ISO_Alpha2":"AZ","ISO_Alpha3":"AZE","UN_Code":"031","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Belgium","ISO_Alpha2":"BE","ISO_Alpha3":"BEL","UN_Code":"056","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bangladesh","ISO_Alpha2":"BD","ISO_Alpha3":"BGD","UN_Code":"050","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bahrain","ISO_Alpha2":"BH","ISO_Alpha3":"BHR","UN_Code":"048","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bahamas","ISO_Alpha2":"BS","ISO_Alpha3":"BHS","UN_Code":"044","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bosnia and Herzegovina","ISO_Alpha2":"BA","ISO_Alpha3":"BIH","UN_Code":"070","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bermuda","ISO_Alpha2":"BM","ISO_Alpha3":"BMU","UN_Code":"060","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bolivia","ISO_Alpha2":"BO","ISO_Alpha3":"BOL","UN_Code":"068","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Barbados","ISO_Alpha2":"BB","ISO_Alpha3":"BRB","UN_Code":"052","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bhutan","ISO_Alpha2":"BT","ISO_Alpha3":"BTN","UN_Code":"064","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Bouvet Island","ISO_Alpha2":"BV","ISO_Alpha3":"BVT","UN_Code":"074","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Botswana","ISO_Alpha2":"BW","ISO_Alpha3":"BWA","UN_Code":"072","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Algeria","ISO_Alpha2":"DZ","ISO_Alpha3":"DZA","UN_Code":"012","Legal_Age":18,"Default_Language":"en-gb"},{"Country_Name":"Mexico","ISO_Alpha2":"MX","ISO_Alpha3":"MEX","UN_Code":"484","Legal_Age":18,"Default_Language":"es"},{"Country_Name":"United States of America","ISO_Alpha2":"US","ISO_Alpha3":"USA","UN_Code":"840","Legal_Age":21,"Default_Language":"en-us"}]}]}
这是API项目中的代码:
cmd2 = new SqlCommand("GetOperatingCountries");
cmd2.Connection = conn2;
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.CommandTimeout = 1000;
SqlParameter param = new SqlParameter();
param.ParameterName = "DefaultLanguage";
if (DefaultLanguage.ToUpper() == "NULL")
{ param.Value = DBNull.Value; }
else { param.Value = DefaultLanguage; }
param.SqlDbType = SqlDbType.VarChar;
param.IsNullable = true;
cmd2.Parameters.Add(param);
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd2);
da.Fill(ds);
message = ds.Tables[0].Rows[0][0].ToString();
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(message, Encoding.UTF8, "application/json");
return ResponseMessage(response);
第一个示例在邮递员中生成了一个不错的json,但是第二个示例仅返回了未格式化的截断字符串。
有人可以解释我在做什么错吗?
答案 0 :(得分:3)
返回的JSON可能会返回多行以得到冗长的结果。
请参见Format Query Results as JSON with FOR JSON(“ FOR JSON子句的输出”部分)和Use FOR JSON output in a C# client app
var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
jsonResult.Append("[]");
}
else
{
while (reader.Read())
{
jsonResult.Append(reader.GetValue(0).ToString());
}
}
答案 1 :(得分:0)
尝试设置最大请求Lnegth或maxAllowedContentLength
<httpRuntime targetFramework="4.5" maxRequestLength="65536" />
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" />
</requestFiltering>
</security>