【问题标题】:Reading from JSON, data not displayed从 JSON 读取,数据不显示
【发布时间】:2012-09-11 04:08:48
【问题描述】:

当我尝试从 javascript 访问 json 中的元素时,我遇到了这个奇怪的问题。我从这样的 url 中检索一个 json 字符串,

        // Create Request
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"www.someurl.com");

        // Create Client
        WebClient client = new WebClient();

        // Assign Credentials
        client.Credentials = new NetworkCredential("username", "pass");

        // Grab Data
        sjson = client.DownloadString(@"www.someurl.com");
        System.Web.Script.Serialization.JavaScriptSerializer oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        oSerializer.MaxJsonLength = Int32.MaxValue;
        sjson = oSerializer.Serialize(sjson);

但是当我在 html 代码中从 javascript 访问这个 sjson 变量时,它不会返回任何内容,但是如果我对其进行硬编码,它会返回值,请帮助解决这个问题。我尝试了很多东西,但没有奏效。我还尝试只传递检索到的 json 字符串而不进行序列化,当我这样做时,javascript 停止工作。 :(以下是javascript代码,

    <script type="text/javascript">
    var jsons = JSON.parse('<%=sjson%>');


    function initialize() {
        alert("hahahahaaa");
        document.writeln(jsons.Body[0].RowId.SensorIdValue);
        //document.writeln(myobject.Body[0].RowId.SensorIdValue);
    }
    </script>

问题是

    document.writeln(myobject.Body[0].RowId.SensorIdValue); 

如果我使用 myobject 变量,则返回一个值,但是

    document.writeln(jsons.Body[0].RowId.SensorIdValue);

当我将它与解析值一起使用时,不返回任何内容。 :(

以下是我通过 c# 运行序列化程序后得到的 json 输出(response.write)示例,

请帮我解决这个问题..我似乎无法在这里找到问题。

编辑:

如果有帮助,下面是我直接从服务器获取的 json 字符串,无需进行任何序列化,

由于所有者的要求,该问题的一些内容已被删除

【问题讨论】:

  • 使用console.log(jsons);验证json对象的值
  • 我不知道 ASP 是如何发送编码后的 JSON 的,但是你尝试去掉斜线?
  • 你序列化了两次!从webservice下载的时候已经序列化了。
  • 哦...我明白了,谢谢您的回复..请检查一下 :)
  • 哦,好吧,我试着去掉斜线:)

标签: c# javascript asp.net json webforms


【解决方案1】:

您看到的是双重 JSON 序列化数据。您从远程服务器检索 JSON,然后使用 JavaScriptSerializer 对其进行第二次 JSON 编码。这是我在 ASMX ScriptServices 的上下文中写的一篇文章,其中更详细地解释了:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/。你的情况并不完全一样,但最终的结果是。

删除 JavaScriptSerializer 代码并返回您检索到的 JSON 字符串 (sjson),而不是再次对其进行序列化。

【讨论】:

  • okey..我正在尝试你的想法 :) 我会回复我的结果 :) 非常感谢你
  • 嗨,我尝试只使用 sjson 变量而不对其进行第二次序列化..sam eresult,没有给出输出我用 url 返回的字符串编辑了代码..你有什么想法吗? ?
  • 和sjson被定义为公共搅拌
【解决方案2】:

您不需要使用 Json 序列化程序,因为远程服务器已经返回了一个 JSON 编码的字符串,您可以直接在您的页面中使用它并避免双重编码。

所以:

public string GetJson()
{
    // Create Client
    using (WebClient client = new WebClient())
    {
        // Assign Credentials
        client.Credentials = new NetworkCredential("username", "pass");

        // Grab Data
        return client.DownloadString(
            @"www.someurl.com"
        );
    }
}

然后:

<script type="text/javascript">
    var jsons = <%= GetJson() %>;
    function initialize() {
        alert("hahahahaaa");
        document.writeln(jsons.Body[0].RowId.SensorIdValue);
        //document.writeln(myobject.Body[0].RowId.SensorIdValue);
    }
</script>

【讨论】:

  • 嘿..你的答案就是这样,这都是因为单引号,就像这样,'' 当我 clld c# 变量时,你的回答为我指明了正确的方向,非常感谢
  • 这很奇怪,因为以前的原理相同。并且仍在工作,但不是为此
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2018-06-10
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多