none
【classicASP】JSONについて RRS feed

  • 質問

  • 今更なのですが、まだ現場がClassicASPを利用しており
    現在、javascript(Ajax)からJSONデータをclassicASPへPOSTして処理を行う機能を調査しております。

    対応として、POSTされたデータをループして処理させたいのですが。
    まだ理解が伴わずDBからJSONデータを返すことは理解できたのですが、逆の処理がどうしても理解できません。

    以下の様なデータをPOSTした際にclassicASP側でループするにはどの様な処理になりますでしょうかご教授頂けますと幸いです。

    {
     "item":[
     {"id" : "1", "name" : "tanaka"},
     {"id" : "2", "name" : "nakata"},
     {"id" : "3", "name" : "nakata"}
    ],
    "message":"aaaaa"
    }

    上記をPOSTし、messageの内容、itemをループして値をresponse.writeで表示するにはどのような内容になりますか。

    JSON生成する際に利用したライブラリは「jsonObject.class asp」と言うものを使いました。

    有識者様、お力をお貸し頂けましたら幸いです。

    2021年7月15日 14:16

回答

  • JSON生成する際に利用したライブラリは「jsonObject.class asp」と言うものを使いました。

    <!--#include file="jsonObject.class.asp" -->
    のことでしょうか。

    <%@language="VBScript" codepage="65001" lcid="1041"%><%Option Explicit
    
    ' 実際は AJAX で送られてきた JSON
    Dim receivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"
    
    Dim JSON, myJSON
    Set JSON = New JSONobject
    Set myJSON = JSON.Parse(receivedJsonString)
    
    Response.Write ".message=" & myJSON.value("message") & vbCrLf
    Response.Write ".item.length=" & myJSON.value("item").length & vbCrLf
    Response.Write ".item[0].name=" & myJSON.value("item").items()(0).value("name") & vbCrLf
    Response.Write ".item[2].name=" & myJSON.value("item").items()(2).value("name") & vbCrLf
    
    Dim oItem
    For Each oItem In myJSON.value("item").items()
        Response.Write "id=" & oItem.value("id") & ";name=" & oItem.value("name") & vbCrLf
    Next
    
    %><!--#include file="jsonObject.class.asp" -->

    あるいは jsonObject.class.asp の代わりに json2.js を使う手法もあります。

    <%@language="VBScript" codepage="65001"%><%Option Explicit
    
    ' 実際は AJAX で送られてきた JSON
    Dim receivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"
    
    Dim myJSON
    Set myJSON = JSON.parse(receivedJsonString)
    
    Response.Write ".message=" & myJSON.message & vbCrLf
    Response.Write ".item.length=" & myJSON.item.length & vbCrLf
    Response.Write ".item[0].name=" & myJSON.item.[0].name & vbCrLf
    Response.Write ".item[2].name=" & myJSON.item.[2].name & vbCrLf
    
    Dim oItem
    For Each oItem In myJSON.item Response.Write "id=" & oItem.id & ";name=" & oItem.name & vbCrLf Next ' json2.min.js もしくは json2.js を、下記から入手して配置しておく ' https://github.com/douglascrockford/JSON-js/blob/master/json2.js ' https://gist.github.com/swapnilshrikhande/ea44c6b9bd08aebbd50a %><script language="JScript" runat="Server" src="./json2.min.js"></script>


    • 編集済み 魔界の仮面弁士MVP 2021年7月16日 2:45 @lcid ディレクティブの指定漏れ
    • 回答としてマーク it_123 2021年7月18日 8:52
    2021年7月16日 2:03
  • jQuery ajax で JSON 文字列を POST すればサーバー側の receivedJsonString にそのままの JSON 文字列を受け取ることができて、魔界の仮面弁士さんが書かれたようにパースして目的が果たせるのであれば、

    data:'{"item":[{"id" : "1", "name" : "tanaka"},{"id" : "2", "name" : "nakata"},{"id" : "3", "name" : "nakata"}],"message":"aaaaa"}'

    となるように設定すれば良いと思います。

    function datasend(o) ... に渡される o が '{"item":[{"id" : "1", "name" : "tanaka"},{"id" : "2", "name" : "nakata"},{"id" : "3", "name" : "nakata"}],"message":"aaaaa"}' という JSON 文字列であれば data: o としてみては?

    そうではなくて、JavaScript オブジェクトなら data: JSON.stringify(o) としてみては?

    それから、処理系によっては、

    contentType: "application/json; charset=utf-8"

    も設定しないと Bad Request ではじかれることもあります。質問者さんのケースでは分かりませんが。
    • 回答としてマーク it_123 2021年7月18日 8:51
    2021年7月18日 7:31

すべての返信

  • classic asp json でググるといろいろ役に立ちそうな記事がヒットすると思うのですが?
    2021年7月15日 21:06
  • JSON生成する際に利用したライブラリは「jsonObject.class asp」と言うものを使いました。

    <!--#include file="jsonObject.class.asp" -->
    のことでしょうか。

    <%@language="VBScript" codepage="65001" lcid="1041"%><%Option Explicit
    
    ' 実際は AJAX で送られてきた JSON
    Dim receivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"
    
    Dim JSON, myJSON
    Set JSON = New JSONobject
    Set myJSON = JSON.Parse(receivedJsonString)
    
    Response.Write ".message=" & myJSON.value("message") & vbCrLf
    Response.Write ".item.length=" & myJSON.value("item").length & vbCrLf
    Response.Write ".item[0].name=" & myJSON.value("item").items()(0).value("name") & vbCrLf
    Response.Write ".item[2].name=" & myJSON.value("item").items()(2).value("name") & vbCrLf
    
    Dim oItem
    For Each oItem In myJSON.value("item").items()
        Response.Write "id=" & oItem.value("id") & ";name=" & oItem.value("name") & vbCrLf
    Next
    
    %><!--#include file="jsonObject.class.asp" -->

    あるいは jsonObject.class.asp の代わりに json2.js を使う手法もあります。

    <%@language="VBScript" codepage="65001"%><%Option Explicit
    
    ' 実際は AJAX で送られてきた JSON
    Dim receivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"
    
    Dim myJSON
    Set myJSON = JSON.parse(receivedJsonString)
    
    Response.Write ".message=" & myJSON.message & vbCrLf
    Response.Write ".item.length=" & myJSON.item.length & vbCrLf
    Response.Write ".item[0].name=" & myJSON.item.[0].name & vbCrLf
    Response.Write ".item[2].name=" & myJSON.item.[2].name & vbCrLf
    
    Dim oItem
    For Each oItem In myJSON.item Response.Write "id=" & oItem.id & ";name=" & oItem.name & vbCrLf Next ' json2.min.js もしくは json2.js を、下記から入手して配置しておく ' https://github.com/douglascrockford/JSON-js/blob/master/json2.js ' https://gist.github.com/swapnilshrikhande/ea44c6b9bd08aebbd50a %><script language="JScript" runat="Server" src="./json2.min.js"></script>


    • 編集済み 魔界の仮面弁士MVP 2021年7月16日 2:45 @lcid ディレクティブの指定漏れ
    • 回答としてマーク it_123 2021年7月18日 8:52
    2021年7月16日 2:03
  • JSON生成する際に利用したライブラリは「jsonObject.class asp」と言うものを使いました。

    <!--#include file="jsonObject.class.asp" -->
    のことでしょうか。

    <%@language="VBScript" codepage="65001" lcid="1041"%><%Option Explicit
    
    ' 実際は AJAX で送られてきた JSON
    Dim receivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"
    
    Dim JSON, myJSON
    Set JSON = New JSONobject
    Set myJSON = JSON.Parse(receivedJsonString)
    
    Response.Write ".message=" & myJSON.value("message") & vbCrLf
    Response.Write ".item.length=" & myJSON.value("item").length & vbCrLf
    Response.Write ".item[0].name=" & myJSON.value("item").items()(0).value("name") & vbCrLf
    Response.Write ".item[2].name=" & myJSON.value("item").items()(2).value("name") & vbCrLf
    
    Dim oItem
    For Each oItem In myJSON.value("item").items()
        Response.Write "id=" & oItem.value("id") & ";name=" & oItem.value("name") & vbCrLf
    Next
    
    %><!--#include file="jsonObject.class.asp" -->

    あるいは jsonObject.class.asp の代わりに json2.js を使う手法もあります。

    <%@language="VBScript" codepage="65001"%><%Option Explicit
    
    ' 実際は AJAX で送られてきた JSON
    Dim receivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"
    
    Dim myJSON
    Set myJSON = JSON.parse(receivedJsonString)
    
    Response.Write ".message=" & myJSON.message & vbCrLf
    Response.Write ".item.length=" & myJSON.item.length & vbCrLf
    Response.Write ".item[0].name=" & myJSON.item.[0].name & vbCrLf
    Response.Write ".item[2].name=" & myJSON.item.[2].name & vbCrLf
    
    Dim oItem
    For Each oItem In myJSON.item Response.Write "id=" & oItem.id & ";name=" & oItem.name & vbCrLf Next ' json2.min.js もしくは json2.js を、下記から入手して配置しておく ' https://github.com/douglascrockford/JSON-js/blob/master/json2.js ' https://gist.github.com/swapnilshrikhande/ea44c6b9bd08aebbd50a %><script language="JScript" runat="Server" src="./json2.min.js"></script>


    ご回答ありがとうございます。
    この内容は確認できていたのですが、JavascriptのAJAXから以下の情報をpostしているのですが
    ご回答頂いたならずに悩んでおります。
    ※Request("obj")の中身をログファイルに作成しても書き込まれません。(lengthもそうでした)


    ①javascript側
     function datasend(o) {
        var postdata = {};
        postdata.obj = o;
        $.ajax({
          url:vURL,
          type:"post",
          cache:false,
          dataType:"text",
          data:postdata
        }).done(function(data) {
            console.log(data)
        }).fail(function(data){
            console.log('ERR')
        });
      }

     ※ oの中身は以下の物になります。

    {
        "Item1": [
            {
                "key": "aaa",
                "val": "111"
            },
            {
                "key": "bbb",
                "val": "222"
            },
            {
                "key": "ccc",
                "val": "333"
            }
        ],
        "Item2": [
            {
                "key": "test1",
                "val": "◎"
            },
            {
                "key": "test2",
                "val": "▼"
            },
            {
                "key": "test4",
                "val": "■"
            },
            {
                "key": "test5",
                "val": "△"
            },
        ],
        "Message": ""
    }

    ②asp
    <%@ LANGUAGE="VBScript" CODEPAGE=65001 %>
    <!--#include file="jsonObject.class.asp" -->

    <%
    on Error Resume Next

    Response.ContentType = "application/json;charset=utf-8"
    Response.LCID = 1041 'ロケールコード 日本
    set JSON = New JSONobject

    Dim oFso,oFile
    'ログファイル生成
    Set oFso = Server.CreateObject("Scripting.FileSystemObject")
    Set oFile = oFso.OpenTextFile(Server.MapPath("LOG/Receiver.log"),8,True)

    Set JSON = JSON.Parse(Request("obj"))
    oFile.WriteLine(JSON.value("Item1").length)

    Set JSON=Nothing

    %>


    2021年7月17日 17:03
  • ご回答ありがとうございます。

    Ajax側で「contentType: "application/json; charset=utf-8",」を設定して

    ご紹介頂いた内容(payload)形式になっていますが

    開示したasp側でrequest("obj")を、そのままresponse.writeで返してやると

    空で戻ってきます。

    2021年7月18日 3:01
  • 紹介した記事に書いたように、jQuery ajax のパラメータ data に渡すのは、

    2. POST 要求(コンテンツとしてデータを送信)の場合、

    (a) 受け取る側が application/x-www-form-urlencoded 形式を期待している場合は JavaScript オブジェクト、

    (b) ASP.NET Web API のように JSON 文字列を期待している場合は JSON 文字列

    ・・・ということで、質問者さんのケースが (b) であれば、JavaScript オブジェクトではなく JSON 文字列にする必要があると言ってます。(質問者さんのコードでは JavaScript オブジェクトを渡しているように見える)
    2021年7月18日 4:03
  • 確かにpostした際のRequest Headersのcontent-typeは「application/x-www-form-urlencoded」でした。

    以下の様な処理方法で行うには「receivedJsonStringへの設定をJSON文字列」で設定すればいけると言う事であれば
    Ajax側の処理を変更すれば良いと言う事でしょうか?

    Dim ResvDataeivedJsonString
    receivedJsonString = "{""item"":[{""id"":""1"",""name"":""tanaka""},{""id"":""2"",""name"":""nakata""},{""id"":""3"",""name"":""nakata""}],""message"":""aaaaa""}"

    Dim myJSON
    Set myJSON = JSON.parse(receivedJsonString)

    ▼JSON文字列に変換してpost
    function datasend(o) {
        var postdata = {};
        postdata.obj = JSON.stringify(o);  ←JSON文字列に変換
        $.ajax({
          url:vURL,
          type:"post",
          cache:false,
          dataType:"text",
          data:postdata
        }).done(function(data) {
            console.log(data)
        }).fail(function(data){
            console.log('ERR')
        });
      }

    聞いてばかりで恐縮ですが宜しくお願い致します。

    2021年7月18日 5:20
  • jQuery ajax で JSON 文字列を POST すればサーバー側の receivedJsonString にそのままの JSON 文字列を受け取ることができて、魔界の仮面弁士さんが書かれたようにパースして目的が果たせるのであれば、

    data:'{"item":[{"id" : "1", "name" : "tanaka"},{"id" : "2", "name" : "nakata"},{"id" : "3", "name" : "nakata"}],"message":"aaaaa"}'

    となるように設定すれば良いと思います。

    function datasend(o) ... に渡される o が '{"item":[{"id" : "1", "name" : "tanaka"},{"id" : "2", "name" : "nakata"},{"id" : "3", "name" : "nakata"}],"message":"aaaaa"}' という JSON 文字列であれば data: o としてみては?

    そうではなくて、JavaScript オブジェクトなら data: JSON.stringify(o) としてみては?

    それから、処理系によっては、

    contentType: "application/json; charset=utf-8"

    も設定しないと Bad Request ではじかれることもあります。質問者さんのケースでは分かりませんが。
    • 回答としてマーク it_123 2021年7月18日 8:51
    2021年7月18日 7:31
  • お付き合い頂きましてありがとうございます。

    何とかご教授頂きました内容を元に無事できました。
    出来上がった成果を以下に記載します。

    ①Javascript
    function testsend(o) {
      $.ajax({
        url:vURL,
        type:"post",
        cache:false,
        dataType:"text",
        data:JSON.stringify(o)
      }).done(function(data) {
          console.log(data);
      }).fail(function(data){
          console.log("ERR");
      });
    }

    ②ASP
    <%@ LANGUAGE="VBScript" CODEPAGE=65001 %>
    <!--#include file="jsonObject.class.asp" -->

    <%
    on Error Resume Next

    Response.ContentType = "application/json;charset=utf-8"
    Response.LCID = 1041 'ロケールコード 日本
    set JSON = New JSONobject

    Function StreamRead(bt)
      Dim stmt
      Set stmt = Server.CreateObject("Adodb.Stream")
      With stmt
        .Type = 1 'adTypeBinary
        .Open
        .Write bt
        .Position = 0
        .Type = 2 'adTypeText
        .Charset = "utf-8"
        StreamRead = stmt.ReadText
        .Close
      End With
      Set stmt = Nothing
    End Function

    If (Request.TotalBytes > 0) Then
        Dim postData : postData = StreamRead(Request.BinaryRead(Request.TotalBytes))
        JSON.parse(postData)
        Set oArr = JSON("Item1")
        For Each Item in oArr.items
          Response.Write "key:" & Item("key") & ",val:" & Item("val") & "\n"
        Next
    End If

    %>
    2021年7月18日 8:51