【问题标题】:request.querystring in vb.netvb.net 中的 request.querystring
【发布时间】:2012-10-03 12:58:59
【问题描述】:

我有这个网址需要解码:

http://gistest:54321/default.aspx?data=%7B%22id%22:%2269403%22,%22longitude%22:%22-143.406417%22,%22latitude%22:%2232.785834%22,%22timestamp%22:%2223-10%2010:12%22%7D

此代码每次都会更改

我使用这个代码:

<%Response.Write(Request.QueryString.Item("data") )%><br/>
<%Response.Write(Request.QueryString.Item("id") )%><br/>
<%Response.Write(Request.QueryString.Item("longitude") )%><br/>
<%Response.Write(Request.QueryString.Item("latitude") )%><br/>
<%Response.Write(Request.QueryString.Item("timestamp") )%><br/>

但我只得到这个作为输出,也许有一个选项可以检查数据是否不为空,然后我 request.querystring 数据中的其他部分:

{"id"="69403","longitude"="-143.406417","latitude"="32.785834","timestamp"="23-10 10:12"}

这是来自


【问题讨论】:

  • “我做错了什么?” - 编译器/调试器应该给你一些线索。您是否有任何异常或错误的详细信息可以提供给我们?如果不查看一些错误详细信息,则不知道问题出在哪里。
  • 您需要一种测试连接、测试查询语法、测试连接字符串等的方法,以及需要测试和调试的许多其他事情。找到一种方法来做到这一点。如果您找不到在整个项目中进行调试的方法,那么这个简单的数据库问题可能会成为众多问题中的第一个。只是我的一点建议。
  • 一个问题是页面顶部的页面语言=“C#”,但您的代码是在VB中。更改为 Language="VB"。
  • 您需要一台运行 ASP.NET 的服务器。 IIS 或 IIS Express,或者用于开发,Visual Studio 的内置服务器之一。你用的是哪一个?

标签: vb.net json request.querystring


【解决方案1】:

我真的希望我正确理解了这个问题。我假设您需要名为 Data 的查询字符串键中每个键的值?为此,我使用了以下代码:

    Dim values() As String = Server.UrlDecode(Request.QueryString("data")).Replace("{", "").Replace("}", "").Split(New Char() {","}, StringSplitOptions.RemoveEmptyEntries)
    For Each value As String In values
        Dim keyValue() As String = value.Split(New Char() {":"}, StringSplitOptions.RemoveEmptyEntries)
        Response.Write(keyValue(0).Replace("""", "") & " : " & keyValue(1).Replace("""", "") & "<br/>")
    Next

简而言之,我对 QueryString("data") 进行解码,替换大括号并使用逗号作为第一个拆分字符将字符串拆分为一个数组。然后我们最终得到一个数组,其中包含以下格式的值“id”:“649403”。

此后,我遍历这些值并根据分号 (:) 字符为每个值拆分最后一次。

使用此方法,您可以动态构建和操作数据。

代码编辑

我用“=”替换了所有“:”的引用,以确保正确检索时间戳,然后根据 = 拆分键值。如有必要,您可以使用选择案例将变量分配给值。 (显然,请确保您的变量未在 select 中声明,因为它不会在正确的范围内供以后使用!)

If Request.QueryString("data") IsNot Nothing Then
    Dim values() As String = Request.QueryString("data").Replace("{", "").Replace("}", "").Replace(""":""", """=""").Split(New Char() {","}, StringSplitOptions.RemoveEmptyEntries)
    For Each value As String In values
        Dim keyValue() As String = value.Split(New Char() {"="}, StringSplitOptions.RemoveEmptyEntries)
        Response.Write(keyValue(0).Replace("""", "") & " : " & keyValue(1).Replace("""", "") & "<br/>")

        Select Case keyValue(0).ToLower()
            Case "id"
                Dim id As String = keyValue(1)
        End Select
    Next
End If

反射编辑

创建对象的实例,然后检索其所有属性(Dim properties() As PropertyInfo = myObj.GetType().GetProperties())。遍历属性并设置名称等于键的值。不要忘记导入 System.Reflection 库。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim data As String = "%7B%22id%22:%2269403%22,%22longitude%22:%22-143.406417%22,%22latitude%22:%2232.785834%22,%22timestamp%22:%2223-10%2010:12%22%7D"
    If data IsNot Nothing Then

        Dim myObj As New MyObject
        Dim properties() As PropertyInfo = myObj.GetType().GetProperties()
        Dim values() As String = Server.UrlDecode(data).Replace("{", "").Replace("}", "").Replace(""":""", """=""").Split(New Char() {","}, StringSplitOptions.RemoveEmptyEntries)
        For Each value As String In values
            Dim keyValue() As String = value.Split(New Char() {"="}, StringSplitOptions.RemoveEmptyEntries)
            For Each prop As PropertyInfo In properties
                If prop.Name.ToLower = keyValue(0).ToLower.Replace("""", "") Then
                    prop.SetValue(myObj, keyValue(1), Nothing)
                End If
            Next
        Next

        myObj.Save()
    End If
End Sub


Public Class MyObject
    Private _ID As String
    Private _Longitude As String
    Private _Latitude As String
    Private _Timestamp As String

    Public Property ID As String
        Get
            Return _ID
        End Get
        Set(value As String)
            _ID = value
        End Set
    End Property

    Public Property Longitude As String
        Get
            Return _Longitude
        End Get
        Set(value As String)
            _Longitude = value
        End Set
    End Property

    Public Property Latitude As String
        Get
            Return _Latitude
        End Get
        Set(value As String)
            _Latitude = value
        End Set
    End Property

    Public Property Timestamp As String
        Get
            Return _Timestamp
        End Get
        Set(value As String)
            _Timestamp = value
        End Set
    End Property

    Public Sub Save()
        'Save logic here
    End Sub
End Class

【讨论】:

  • 感谢您提供此代码:我现在知道了:id:69403 经度:-143.406417 纬度:32.785834 时间戳:23-10 10 {"id":"69403","longitude":"- 143.406417","latitude":"32.785834","timestamp":"23-10 10:12"} 只有我需要这样:Dim id = that value..
  • 我也没有正确获取时间戳,应该是 23-1‌​0 10:12,但它是 23-10 10
  • 我已经修改了上面的代码来解决时间戳问题。我希望你来对。如果您需要其他任何帮助,请大声喊叫。关于您的变量分配,如果您对上述内容不满意,请向我提供有关您需要对变量执行什么操作的更多信息。
  • 好的,所以如果我想要所有 Dim 的经度,我猜我应该多次使用 Select Case 函数
  • 是的,您需要这样做。除非您想使用像排序列表或数组列表这样的集合对象。您还可以查看反射以使其更具动态性。 social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/…
【解决方案2】:

我认为您遇到的问题是您发布的 URL 中只有一个查询字符串参数,即data。其余信息编码在 data 查询字符串值中。存储在data 中的值几乎看起来像一个JSON/Javascript 对象,除了在属性名称和值之间有一个= 而不是:

所以,基本上你将无法使用Request.QueryString 来获取idlongitudelatitude 等的值。我认为你的选择是编写一些代码来解析值的data 或将= 替换为: 并使用.NET 的JSON 解析器(即JavascriptSerializer 类或JSON.net)。

就个人而言,我会在代码隐藏中编写一个返回Dictionary(Of String, Object) 的方法。在这种方法中,我只需将每个"=" 更改为":",然后使用.NET 提供的JavaScriptSerializer 来解析字符串。我现在手头没有 ASP.NET 实例,但是我在 LinqPad 中放置的以下示例应该可以说明这个想法:

Sub Main
        Dim url = "http://gistest:54321/default.aspx?data=%7B%22id%22=%2269403%22,%22longitude%22=%22-143.406417%22,%22latitude%22=%2232.785834%22,%22timestamp%22=%2223-10%2010:12%22%7D"
        Dim uri = New Uri(url)
        Dim data = System.Web.HttpUtility.ParseQueryString(uri.Query)("data")
        Dim o = ParseData(data)
        Console.WriteLine(o("id"))
        Console.WriteLine(o("longitude"))
        Console.WriteLine(o("latitude"))
        Console.WriteLine(o("timestamp"))
End Sub

Function ParseData(data As String) As Dictionary(Of String, Object)
    Dim js = new System.Web.Script.Serialization.JavaScriptSerializer()
    Dim o = js.DeserializeObject(data.Replace("""=""", """:"""))
    ParseData = DirectCast(o, Dictionary(Of String, Object))
End Function

关于这种方法需要注意的一点是,我希望 URL 的格式与您发布的格式相同。您可能需要修改此方法,使其更健壮地处理不同的输入。

如果您将 ParseData 函数放入您的代码隐藏中,那么您首页中的以下代码应该为您提供您正在寻找的输出(再次,抱歉我没有现在要测试的 ASP.NET 实例):

<%
    Dim o = ParseData(Request.QueryString.Item("data"))
    Response.Write(o("id"))
    Response.Write("<br />")
    Response.Write(o("longitude"))
    Response.Write("<br />")
    Response.Write(o("latitude"))
    Response.Write("<br />")
    Response.Write(o("timestamp"))
    Response.Write("<br />")
%>

【讨论】:

  • 是的,我将“=”更改为“:”,所以字符串现在看起来像这样:gistest:54321/… 但代码在不断变化。但是当我使用底部的代码时,它让我知道他不知道,因为那个 ParseData @rsbarro
  • 我不知道如何反序列化这个 json 字符串。确实是一个json字符串POST
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多