Вопрос по json, asp-classic, vbscript – Какие-нибудь хорошие библиотеки для разбора JSON в Classic ASP? [закрыто]

72

Мне удалось найти миллионы библиотек дляgenerating JSON в классическом ASP (VBScript), но я не смог найти ЛЮБОГО дляparsing.

Я хочу что-то, что я могу передать строку JSON и получить какой-нибудь объект VBScript (Array, Scripting.Dictionary и т. Д.)

Can anyone recommend a library for parsing JSON in Classic ASP?
Почему бы не создать DLL, используя доступные библиотеки .net? Shoban
Я знаю, что это старый, но вы можете проверить мой класс AspJson. Это мне очень помогает:github.com/rcdmk/aspJSON rcdmk
Действительно, я был бы счастлив найти что-то, что только что сделало массивы (в том числе многомерные). Он не должен поддерживать полную спецификацию JSON. Mark Biek
Из-за ограничений клиента я не могу ничего устанавливать на сервер. Я надеюсь на что-то, что является чистым классическим ASP. Mark Biek

Ваш Ответ

8   ответов
2

но она довольно тяжелая, если вам просто нужна функциональность обработки JSON.

Однако я взял файл base.asp и файл класса json.asp из проекта AX и успешно использовал их для реализации анализа JSON в моем проекте.

Для поколения JSON я нашелaspjson было проще интегрировать. Он также имеет более мощные функции, связанные с JSON. Немного не хватает документации по топору, и было больше работы по интеграции в проект, однако он отлично справляется с сериализацией своего объекта JSON VB обратно в строку.

Хороший вопрос - обновил мой ответ, чтобы уточнить
Aspjson неparse JSON, это толькоgenerates Это. Mark Biek
84

что Classic ASP включает в себя JScript, а также VBScript. Интересно, что вы можете анализировать JSON с помощью JScript и использовать полученные объекты непосредственно в VBScript.

Следовательно, можно использовать каноническийhttps://github.com/douglascrockford/JSON-js/blob/master/json2.js в серверном коде с нулевыми изменениями.

Конечно, если ваш JSON включает какие-либо массивы, они останутся массивами JScript после завершения анализа. Вы можете получить доступ к содержимому массива JScript из VBScript, используя точечные обозначения.

<%@Language="VBScript" %>
<%
Option Explicit
%>

<script language="JScript" runat="server" src='path/to/json2.js'></script>

<%

Dim myJSON
myJSON = Request.Form("myJSON") // "[ 1, 2, 3 ]"
Set myJSON = JSON.parse(myJSON) // [1,2,3]
Response.Write(myJSON)          // 1,2,3
Response.Write(myJSON.[0])      // 1
Response.Write(myJSON.[1])      // 2
Response.Write(myJSON.[2])      // 3
%>
на самом деле это лучшее решение, которое использует всю структуру
В случае, если это не работает ни для кого - мне пришлось использовать<!--#include file="json2.min.asp"--> вместо<script>и завернуть<% ... %> вокруг файла json2.min.js для создания json2.min.asp, в противном случаеJSON объект не был доступен.
@ Андрей, но разве не требуется изменить всю страницу на JScript вместо VBScript? Я попробовал то, что вы предложили, и я получаю ошибку компиляции VBScript при встрече/*.
Спасибо за показ, как получить доступ к элементам массива. Я провел пару часов, борясь, чтобы понять это, и сдался!
В библиотеке AX это реализованоhere.
7

VbsJson класс, который имеет & quot;Decode& Quot; метод анализа JSON в VBScript и & quot;Encode& Quot; метод для генерации JSON из VBScript. Код несколько длинный, поэтому я не вставляю его сюда.

Это единственное решение, которое я смог получить, используя IIS / IIS Express 8.5. Я подозреваю, что в компиляторах ASP произошли значительные изменения, из-за которых многие другие ответы устарели.
Я конвертировал VBS файлы в ASP. Работает красиво! Чисто и просто. Большое спасибо, Демон.
2

 Если JSON прост и всегда имеет одинаковую структуру, вы можете проанализировать его самостоятельно, это быстро и просто.

 'read data from client
 records = Request.Form("records")
 'convert the JSON string to an array
 Set oRegExpre = new RegExp
 oRegExpre.Global = true
 oRegExpre.Pattern = "[\[\]\{\}""]+"
 records = replace(records, "},{","||")
 records = oRegExpre.Replace(records, "" )
 aRecords = split(records,"||")
 'iterate the array and do some cleanup
 for each rec in aRecords
   aRecord = split(rec,",")
   id          = split(aRecord(1),":")(1)
   field       = split(aRecord(0),":")(0)
   updateValue = split(aRecord(0),":")(1)
   updateValue = replace(updateValue,chr(10),"\n")
   updateValue = replace(updateValue,chr(13),"\r")
   updateValue = replace(updateValue,"'","''")
  'etc
next
Я пытался найти библиотеку JSON, когда твое сообщение отослало меня от моего подхода, не связанного с KISS. Я понял, что мне действительно нужно проанализировать сообщение с очень четко определенным форматом. Я мог бы нарезать и разделить это на что-то полезное сам. Благодарю.
3

когда искал легкое чистое решение только для VBScript.

Собрав элементарный конвертер JSON в XML, мы можем пройтись по строке JSON и превратить ее в документ Microsoft.XMLDOM.

Оттуда мы используем XML API Microsoft, включая запросы XPath, чтобы извлечь любые значения, которые мы хотели.

Это работает с простым JSON, но я никогда не предназначал этот ответ для чего-то более сложного.

Для более надежного решения лучшим интерпретатором JSON является правильный движок Javascript. Поэтому я очень рекомендую принятый ответ на этот вопрос, т.е.Какие-нибудь хорошие библиотеки для разбора JSON в Classic ASP?

Function JSONtoXML(jsonText)
  Dim idx, max, ch, mode, xmldom, xmlelem, xmlchild, name, value

  Set xmldom = CreateObject("Microsoft.XMLDOM")
  xmldom.loadXML "<xml/>"
  Set xmlelem = xmldom.documentElement

  max = Len(jsonText)
  mode = 0
  name = ""
  value = ""
  While idx < max
    idx = idx + 1
    ch = Mid(jsonText, idx, 1)
    Select Case mode
    Case 0 ' Wait for Tag Root
      Select Case ch
      Case "{"
        mode = 1
      End Select
    Case 1 ' Wait for Attribute/Tag Name
      Select Case ch
      Case """"
        name = ""
        mode = 2
      Case "{"
        Set xmlchild = xmldom.createElement("tag")
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
      Case "["
        Set xmlchild = xmldom.createElement("tag")
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
      Case "}"
        Set xmlelem = xmlelem.parentNode
      Case "]"
        Set xmlelem = xmlelem.parentNode
      End Select
    Case 2 ' Get Attribute/Tag Name
      Select Case ch
      Case """"
        mode = 3
      Case Else
        name = name + ch
      End Select
    Case 3 ' Wait for colon
      Select Case ch
      Case ":"
        mode = 4
      End Select
    Case 4 ' Wait for Attribute value or Tag contents
      Select Case ch
      Case "["
        Set xmlchild = xmldom.createElement(name)
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
        name = ""
        mode = 1
      Case "{"
        Set xmlchild = xmldom.createElement(name)
        xmlelem.appendChild xmlchild
        xmlelem.appendchild xmldom.createTextNode(vbCrLf)
        xmlelem.insertBefore xmldom.createTextNode(vbCrLf), xmlchild
        Set xmlelem = xmlchild
        name = ""
        mode = 1
      Case """"
        value = ""
        mode = 5
      Case " "
      Case Chr(9)
      Case Chr(10)
      Case Chr(13)
      Case Else
        value = ch
        mode = 7
      End Select
    Case 5
      Select Case ch
      Case """"
        xmlelem.setAttribute name, value
        mode = 1
      Case "\"
        mode = 6
      Case Else
        value = value + ch
      End Select
    Case 6
      value = value + ch
      mode = 5
    Case 7
      If Instr("}], " & Chr(9) & vbCr & vbLf, ch) = 0 Then
        value = value + ch
      Else
        xmlelem.setAttribute name, value
        mode = 1
        Select Case ch
        Case "}"
          Set xmlelem = xmlelem.parentNode
        Case "]"
          Set xmlelem = xmlelem.parentNode
        End Select
      End If
    End Select
  Wend

  Set JSONtoXML = xmlDom
End Function

Приведенный выше скрипт преобразует следующий JSON:

{
  "owningSystemUrl": "http://www.arcgis.com",
  "authInfo": {
    "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
    "isTokenBasedSecurity": true
  }
}

в:

<xml owningSystemUrl="http://www.arcgis.com">
    <authInfo
        tokenServicesUrl="https://www.arcgis.com/sharing/rest/generateToken"
        isTokenBasedSecurity="true" >
    </authInfo>
</xml>

Теперь мы можем использовать XPath для извлеченияtokenServicesUrl, например:

dom.SelectSingleNode("xml/authInfo").getAttribute("tokenServicesUrl")
' Returns: "https://www.arcgis.com/sharing/rest/generateToken"
Преобразуйте его в класс :) Используйте код gen над json, чтобы создать реальный класс и загрузить его из json. Тогда у вас есть все возможности скриптового языка, чтобы делать все, что вы хотите
Это интересная идея. Спасибо! Mark Biek
@ Брайан-Уайт думал, что, раз уж это XML, у вас есть полный API-интерфейс Microsoft XML DOM, чтобы делать что угодно.
Зачем конвертировать JSON в XML?
15

ASP экстрим фреймворк, который имеет поддержку JSON?

Я должен отметить, что этот класс JSON, похоже, имеет проблемы с Unicode. Mark Biek
вау .. рад что я смог тебе помочь ;-)
Просто совет для тех, кто пытается включить файл json2.asp на страницу vbscript через & lt; script language = & quot; JScript & quot; Runat = & Quot; Сервер & Quot; SRC = & Quot; json2.asp & Quot; & GT; & Lt; / сценарий & GT; убедитесь, что вы удалили & lt; script language = & quot; Javascript & quot; Runat = & Quot; Сервер & Quot; & GT; и & lt; / script & gt; теги из json2.asp Пока мы экспериментировали с include (наш код включения v.complex), я немного почесал голову. Надеюсь, это поможет кому-то. :-)
Ты мой герой. Это работает отлично! Я собираюсь взглянуть на фреймворк, потому что он кажется очень удобным, но я смог просто поднять класс JSON и начать использовать его сам по себе. Mark Biek
13

на работать. Но мне помогло следующее:

http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP

Загрузите следующее как & quot; json2.min.asp & quot;

http://tforster.wik.is/@api/deki/files/2/=json2.min.asp

Добавьте следующую строку в начало вашего ASP-файла:

<script language="javascript" runat="server" src="json2.min.asp"></script>

Затем вы можете использовать JSON в ASP.

   Dim car: Set car = JSON.parse("{""brand"":""subaru"",""model"":""outback sport"",""year"":2003," & _
                                 """colour"":""green"",""accessories"":[" & _
                                 "{""foglamps"":true},{""abs"":true},{""heatedSeats"":true}]}")

   Response.Write("brand: " & car.brand & "<br/>")                               
   Response.Write("model: " & car.model & "<br/>")                               
   Response.Write("colour: " & car.colour & "<br/>")                               
   Response.Write("has foglamps: " & CStr(car.accessories.get(0).foglamps) & "<br/>")                               

   car.accessories.get(0).foglamps = false
   Response.Write("has foglamps: " & CStr(car.accessories.get(0).foglamps) & "<br/>")                               
   Response.Write("new Json: " & JSON.stringify(car) & "<br/>")

   Set car = Nothing

Примечание. Для анализа массива элементов необходимо выполнить следующие действия:

   for each iTmp in testing
       if (TypeName(iTmp))<>"JScriptTypeInfo" then 
           Response.Write("Item: " &  iTmp & "<br/>")
       end if
   next
Вам не нужна специальная версия JSON2.js со вкусом ASP. Просто используйте оригинал и сделайте ссылку на него, используяsrc атрибут<script> тег. Увидетьstackoverflow.com/a/1021848/48082 для деталей.
4
Самый лучший по комментариям самой библиотеки здесь:github.com/nagaozen/asp-xtreme-evolution/blob/master/lib/axe/… Вы получаете upvote.

Похожие вопросы