Есть ли хорошие библиотеки для разбора JSON в классическом ASP?

Мне удалось найти огромное количество библиотек для генерации JSON в классическом ASP (VBScript), но я не нашел НИКАКИХ для синтаксического анализа.

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

Может ли кто-нибудь порекомендовать библиотеку для разбора JSON в Classic ASP?


person Mark Biek    schedule 19.06.2009    source источник
comment
Почему бы не создать DLL, используя доступные библиотеки .net?   -  person Shoban    schedule 19.06.2009
comment
Из-за ограничений клиента я не могу ничего установить на сервер. Я надеюсь на что-то, что является чистым классическим ASP.   -  person Mark Biek    schedule 19.06.2009
comment
На самом деле, я был бы счастлив найти что-то, что делало бы только массивы (в том числе многомерные). Необязательно поддерживать полную спецификацию JSON.   -  person Mark Biek    schedule 19.06.2009
comment
Я знаю, что это старый, но вы можете проверить мой класс AspJson. Мне это очень помогает: github.com/rcdmk/aspJSON   -  person Ricardo Souza    schedule 22.07.2015


Ответы (8)


Имейте в виду, что классический 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
%>
person Chris Nielsen    schedule 20.06.2009
comment
В библиотеке AX реализовано это здесь. - person sholsinger; 08.03.2011
comment
на самом деле это лучшее решение, которое использует всю структуру - person Rafael; 16.12.2011
comment
Если это ни у кого не сработает - мне пришлось использовать <!--#include file="json2.min.asp"--> вместо <script> и обернуть <% ... %> файл json2.min.js для создания json2.min.asp, иначе объект JSON был бы недоступен. - person Flash; 22.06.2012
comment
@Andrew, но разве для этого не нужно менять всю страницу на JScript вместо VBScript? Я попробовал то, что вы предложили, и при встрече с /* получаю ошибку компиляции VBScript. - person Keith; 03.08.2015
comment
Спасибо за то, что показали, как получить доступ к элементам массива. Я потратил пару часов на борьбу, чтобы понять это, и сдался! - person Santosh; 21.12.2016
comment
Крис Нильсен Как я могу получить доступ к значению объекта? - person sandipchandanshive; 15.12.2020

Не уверен в этом. Вы проверили экстремальный ASP framework с поддержкой JSON?

person Shoban    schedule 19.06.2009
comment
Ты мой герой. Это прекрасно работает! Я собираюсь взглянуть на фреймворк, потому что он кажется очень удобным, но я смог просто извлечь класс JSON и начать использовать его отдельно. - person Mark Biek; 19.06.2009
comment
вау .. Рад, что смог тебе помочь ;-) - person Shoban; 19.06.2009
comment
Однако я должен упомянуть, что у этого класса JSON проблемы с Unicode. - person Mark Biek; 22.12.2009
comment
Просто совет для тех, кто пытается включить файл json2.asp на страницу vbscript с помощью ‹script language = JScript runat = server src = json2.asp› ‹/script›, убедитесь, что вы удалили ‹script language = Javascript runat = server› и теги ‹/script› из json2.asp Пока я экспериментировал с включениями (наш код включения - v.complex), я на время почесал в затылке. Так что надеюсь, что это кому-то поможет. :-) - person Alex KeySmith; 16.09.2011

Я не мог заставить работать экстремальную эволюцию или предложение Криса Нильсона. Но для меня сработало следующее:

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

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

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
person seanyboy    schedule 08.06.2010
comment
Вам не нужна специальная версия JSON2.js с добавлением ASP. Просто используйте оригинал и укажите на него ссылку с помощью атрибута src тега <script>. Подробнее см. stackoverflow.com/a/1021848/48082. - person Cheeso; 09.03.2012

Недавно я реализовал класс VbsJson, который имеет метод «Decode» для синтаксического анализа JSON в VBScript и метод «Encode» для создания JSON из VBScript. Код довольно длинный, поэтому я не вставляю его сюда.

person Demon    schedule 07.05.2012
comment
Я преобразовал файлы vbs в asp. Красиво работает! Чисто и просто. Большое спасибо Демону. - person Mark; 31.01.2013
comment
Это единственное решение, которое я мог заставить работать с помощью IIS / IIS Express 8.5. Я подозреваю, что в компиляторы ASP были внесены значительные изменения, которые сделали многие другие ответы устаревшими. - person Keith; 03.08.2015

Я написал этот ответ, когда искал легкое решение только на чистом VBScript.

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

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

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

Для более надежного решения лучший интерпретатор JSON - это надлежащий движок Javascript. Поэтому я настоятельно рекомендую принятый ответ на этот вопрос, то есть Есть ли хорошие библиотеки для анализа JSON в классическом 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"
person Stephen Quan    schedule 23.01.2012
comment
Это интересная идея. Спасибо! - person Mark Biek; 24.01.2012
comment
Зачем конвертировать json в XML ?? - person Brian White; 05.02.2018
comment
@ brian-white думал, что если это XML, у вас будет полный API Microsoft XML DOM, чтобы делать что угодно. - person Stephen Quan; 05.02.2018
comment
Преобразуйте его в класс :) Используйте некоторую генерацию кода поверх json, чтобы создать настоящий класс и загрузить его из json. Тогда у вас есть все возможности языка сценариев, чтобы делать все, что вы хотите. - person Brian White; 09.11.2018

http://github.com/nagaozen/asp-xtreme-evolution/

person Hasan Köroğlu    schedule 22.04.2010
comment
Самый лучший, согласно комментариям самой библиотеки, находится здесь: github.com/nagaozen/asp-xtreme-evolution/blob/master/lib/axe/ Вы получаете голос" за ". - person sholsinger; 08.03.2011

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

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

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

person Joe Niland    schedule 13.12.2011
comment
aspjson не анализирует JSON, он только генерирует его. - person Mark Biek; 13.12.2011
comment
Хороший момент - обновил свой ответ, чтобы прояснить - person Joe Niland; 16.12.2011

решения здесь очень хорошие, но иногда излишни. Если 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
person peter    schedule 07.05.2012
comment
Я пытался найти библиотеку JSON, когда ваш пост отослал меня от моего подхода, не относящегося к KISS. Я понял, что мне действительно нужно будет проанализировать сообщение с очень четко определенным форматом. Я мог бы сам нарезать и разделить его на что-нибудь пригодное для использования. Спасибо. - person alphadogg; 17.09.2012