【问题标题】:Creating a double serialized JSON object in REST SOE C#在 REST SOE C# 中创建双序列化 JSON 对象
【发布时间】:2013-11-16 01:45:36
【问题描述】:

我不确定我是否对我的 JSON 对象进行了双重序列化,但输出会导致不需要的格式。我通过 ArcGIS Server Object Extension (REST SOE) 公开 REST 端点。我最近还实现了 JSON.Net,它基本上允许我删除几行代码。

这里是处理程序,它是为服务创建数据的核心部分(对于非 GIS 窥视者)。

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());
    }

结果是丑陋的转码 JSON:

{
    "Towns": "[{\"Column1\":\"ANSONIA\"},{\"Column1\":\"BETHANY\"},{\"Column1\":\"BLOOMFIELD\"}]",
    "GLDesc": "[{\"Column1\":\"Commercial\"},{\"Column1\":\"Industrial\"},{\"Column1\":\"Public\"}]"
}

是因为我以某种方式对其进行了双重序列化吗?感谢您查看此内容。

【问题讨论】:

    标签: c# json rest json.net arcgis-server


    【解决方案1】:

    是的,您正在对其进行双重序列化。它就在您的代码中。

    对于您的每个数据表dataTableTownsdataTableGLDesc,您调用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"}]
    }
    

    【讨论】:

    • 优秀。我给你买了虚拟啤酒。感谢您澄清这一点,我也认为我也会切换到 JSON.Net。
    • 谢谢你的啤酒。 =)
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多