2

デコードする必要がある次の 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

このコードは毎回変わります

私はこのコードを使用します:

<%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/>

しかし、私はこれを出力としてのみ取得します。おそらく、データがnullでないかどうかを確認するオプションがあり、データの他の部分を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にクエリ文字列パラメータが1つしかないことだと思います。それはdataです。残りの情報は、dataクエリ文字列値にエンコードされます。に格納されている値は、プロパティ名と値の間に。の代わりにが含まれていることを除けば、 JSON /Javascriptオブジェクトdataのように見えます。=:

したがって、基本的には、、、などRequest.QueryStringの値を取得するために使用することはできません。オプションは、自分の値を解析するコードを記述するか、を置き換えて.NET用のJSONパーサーを使用することだと思います(つまり、クラスまたは)。idlongitudelatitudedata=:JavascriptSerializerJSON.net

個人的には、コードビハインドに。を返す​​メソッドを記述しDictionary(Of String, Object)ます。その方法では、すべて"="をaに変更してから":"、提供されている.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

このアプローチについて注意すべきことの1つは、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" の形式の値を含む配列になります。

その後、値を反復処理し、セミコロン (:) 文字に基づいて各値を最後に 1 回分割します。

この方法を使用すると、データを動的に構築および操作できます。

コード編集

「:」のすべての参照を「=」に置き換えて、タイムスタンプが正しく取得され、= に基づいてキー値が分割されるようにしました。必要に応じて、選択ケースを使用して変数を値に割り当てることができます。(明らかに、後で使用するために適切なスコープにないため、選択内で変数が宣言されていないことを確認してください!)

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 に答える