2

我有这个需要解码的网址:

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"}

这是从

<%Response.Write(Request.QueryString.Item("data") )%>

4

2 回答 2

1

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

因此,基本上您将无法使用Request.QueryString来获取 、 、 等的值idlongitudelatitude认为您的选择是编写一些代码来解析您data自己的值,或者替换为=:使用 JSON 解析器用于 .NET(即,JavascriptSerializer类或JSON.net)。

就个人而言,我会在代码隐藏中编写一个方法,该方法将返回一个Dictionary(Of String, Object). 在那种方法中,我只需将 each 更改"="为 a ":",然后使用JavaScriptSerializer.NET 提供的来解析字符串。我现在手头没有 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 />")
%>
于 2012-10-30T08:32:35.567 回答
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
于 2012-10-30T10:24:40.430 回答