Будь-які хороші бібліотеки для синтаксичного аналізу JSON у класичному ASP? [зачинено]


77

Мені вдалося знайти мільйон бібліотек для генерації JSON у класичному ASP (VBScript), але я не знайшов БУДЬ-ЯКОГО для аналізу .

Я хочу щось, що я можу передати рядок JSON і повернути якийсь об'єкт VBScript (Array, Scripting.Dictionary тощо)

Хтось може порекомендувати бібліотеку для синтаксичного аналізу JSON у класичному ASP?


1
Чому б не створити DLL, використовуючи доступні бібліотеки .net?
Шобан

1
Через обмеження клієнта я не можу нічого встановити на сервері. Я сподіваюся на щось, що є чисто класичним ASP.
Марк Бік,

1
Справді, я був би радий знайти щось, що просто робило масиви (включаючи багатовимірні). Він не повинен підтримувати повну специфікацію JSON.
Марк Бік

3
Я знаю, що це старе, але ви можете перевірити мій клас AspJson. Мені це дуже допомагає: github.com/rcdmk/aspJSON
Рікардо Соуза

Відповіді:


92

Майте на увазі, що класичний 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
%>

5
У бібліотеці AX це тут реалізовано .
sholsinger

насправді це краще рішення, яке використовує всю структуру
Рафаель

6
На випадок, якщо це ні в кого не працює - мені довелося використовувати <!--#include file="json2.min.asp"-->замість <script>і обернути <% ... %>файл json2.min.js для створення json2.min.asp, інакше JSONоб’єкт був недоступний.
Flash

1
@Andrew, але хіба для цього не потрібно змінювати всю сторінку на JScript замість VBScript? Я спробував те, що ви запропонували, і при зустрічі я отримую помилку компіляції VBScript /*.
Кіт

3
Дякуємо, що показали, як отримати доступ до елементів масиву. Я витратив пару годин на боротьбу, щоб зрозуміти це, і здався!
Сантош,

16

Не впевнений у цьому. Ви перевіряли ASP extreme framework, який підтримує JSON?


Ти мій герой. Це чудово працює! Я збираюся поглянути на фреймворк, тому що він здається дуже зручним, але я зміг просто підняти клас JSON і почати використовувати його сам по собі.
Марк Бік,

вау .. Радий, що я зміг вам допомогти ;-)
Шобан,

2
Однак слід зазначити, що цей клас JSON, схоже, має проблеми з Unicode.
Марк Бік,

Лише підказка для тих, хто намагається включити файл json2.asp на сторінку vbscript через <script language = "JScript" runat = "server" src = "json2.asp"> </script>, переконайтеся, що ви видалите <мову сценарію = "Javascript" runat = "server"> та </script> теги з json2.asp Поки експериментуючи з включеннями (наш код включення - v.complex), я деякий час чухав голову. Тож сподіваюся, що це комусь допоможе. :-)
Alex KeySmith

14

Я не міг отримати екстремальну еволюцію чи пропозицію Кріса Нільсона працювати. Але для мене працювало наступне:

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

1
Вам не потрібна спеціальна версія JSON2.js зі смаком ASP. Просто використовуйте оригінал і посилайтеся на нього, використовуючи srcатрибут <script>тегу. Детальніше див. Na stackoverflow.com/a/1021848/48082 .
Cheeso

8

Нещодавно я реалізував клас VbsJson , який має метод " Decode " для синтаксичного аналізу JSON на VBScript і метод " Encode " для створення JSON з VBScript. Код дещо довгий, тому я не вставляю його сюди.


Я перетворив файли vbs на asp. Це чудово працює! Чисто і просто. Велике спасибі Демону.
Марк

Це єдине рішення, яке я міг отримати для роботи за допомогою IIS / IIS Express 8.5. Я підозрюю, що в компіляторах ASP відбулися суттєві зміни, через які багато інших відповідей застаріли.
Кіт

4

Я написав цю відповідь, коли шукав полегшеного чистого рішення лише для VBScript.

Склавши елементарний перетворювач JSON у XML, ми можемо пройти рядок JSON і перетворити його на документ Microsoft.XMLDOM.

Звідти ми використовуємо Microsoft XML API, включаючи запити 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"

Це цікава ідея. Дякую!
Марк Бік,

1
Навіщо конвертувати json в XML ??
Брайан Уайт

@ brian-white думка полягала в тому, що коли це XML, у вас є повний API Microsoft XML DOM, щоб робити все, що завгодно.
Stephen Quan

Перетворіть його в клас :) Використовуйте код gen над json, щоб створити справжній клас і завантажте його з json. Тоді ви володієте повною мірою мови сценаріїв, щоб робити все, що завгодно
Брайан Уайт


2

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

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

Для генерації JSON я виявив, що aspjson простіше інтегрувати. Він також має більш потужні функції, пов'язані з json. Документації для сокири трохи не вистачало і було більше роботи для інтеграції в проект, однак вона робить чудову роботу з серіалізації свого об'єкта JSON VB назад у рядок.


1
aspjson не аналізує JSON, він лише генерує його.
Mark Biek

Хороший момент - оновив мою відповідь для уточнення
Джо Ніланд

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. Я зрозумів, що мені справді потрібно буде проаналізувати повідомлення з дуже чітко визначеним форматом. Я міг би нарізати і поділити його на щось корисне для себе. Дякую.
alphadogg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.