在REST SOE C中创建双序列化JSON对象#
-
21-12-2019 - |
题
我不确定我是否在双序列化我的JSON对象,但输出结果是不需要的格式。我正在通过ArcGIS Server对象扩展(REST SOE)公开REST端点。我最近也实施了JSON.Net 这基本上允许我删除几行代码。
所以这里是处理程序,它是为服务创建数据的核心部分(对于您非GIS peeps)。
private byte[] SearchOptionsResHandler(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties)
{
responseProperties = null;
JsonObject result = new JsonObject();
// Towns
DataTable dataTableTowns = GetDataTableTowns();
String jsonStringTowns = JsonConvert.SerializeObject(dataTableTowns);
result.AddString("Towns", jsonStringTowns);
// GL_Description
DataTable dataTableGLDesc = GetDataTableGLDesc();
String jsonStringGLDesc = JsonConvert.SerializeObject(dataTableGLDesc);
result.AddString("GLDesc", jsonStringGLDesc);
return Encoding.UTF8.GetBytes(result.ToJson());
}
结果是丑陋的scaped JSON:
{
"Towns": "[{\"Column1\":\"ANSONIA\"},{\"Column1\":\"BETHANY\"},{\"Column1\":\"BLOOMFIELD\"}]",
"GLDesc": "[{\"Column1\":\"Commercial\"},{\"Column1\":\"Industrial\"},{\"Column1\":\"Public\"}]"
}
是因为我把它双重序列化了吗?谢谢你看这个。
解决方案
是的,你正在双重序列化它。就在你的代码里。
对于每个数据表, dataTableTowns
和 dataTableGLDesc
, ,你在打电话 JsonConvert.SerializeObject()
将它们转换为JSON字符串,然后将其添加到结果中 JsonObject
.然后你打电话 ToJson()
在结果上,这大概是将整个事情再次序列化为JSON。
JsonObject
不属于Json.Net,而 JsonConvert
是,所以我会建议使用一个或另一个。通常,您只想将所有内容累积到单个结果对象中,然后在最后将整个事物序列化一次。以下是我将如何做到这一点Json.Net 使用匿名对象保存结果:
var result = new
{
Towns = GetDataTableTowns(),
GLDesc = GetDataTableGLDesc()
};
string json = JsonConvert.SerializeObject(result);
return Encoding.UTF8.GetBytes(json);
这里是输出:
{
"Towns":[{"Column1":"ANSONIA"},{"Column1":"BETHANY"},{"Column1":"BLOOMFIELD"}],
"GLDesc":[{"Column1":"Commercial"},{"Column1":"Industrial"},{"Column1":"Public"}]
}
不隶属于 StackOverflow