2015-07-12 3 views
1

У меня есть JSON в этом формате: enter image description hereКак анализировать данные JSON для привязки зависимых выпадающих списков?

{ "Инжиниринг": { "Электротехника": { "Исследования Staff": [ "научный сотрудник", "исследование sciencetist", "старший научный sciencetist "]," Non-tenure-track ": [« professor »,« Associate »,« ассистент-исследователь »,« клинический профессионал », «посещение профессора», «посещение профильного специалиста», «посещение ассистент профессора»], «Профессиональный персонал»: [«бизнес» ersity исследования администратор " "отдел административный помощник"]},

"Компьютерные науки": { "Научные сотрудники": [ "научный сотрудник", "исследование sciencetist", "старший научный sciencetist"]," ординарный «: [« выдающийся » профессор», «профессор», доцент, доцент, «Преподавательский факультет»: [«уважаемый профессор», «профессор», «ассоциированный профессор», «доцент», ]},

"Компьютерная инженерия": { "ординарный": [ "выдающийся профессор", "профессор", "доцент", "доцент"], "Педагогический факультет": [ "lectu RER», "старший преподаватель", "адъюнкт-профессор"], "Профессиональный персонал": [ "бизнес-менеджер", "университетские исследования администратор", "отдел административного помощника"]}

},

«Наука»: {«Физика»: {«Исследовательский состав»: [«исследование ассоциированный», «научный научный эксперт», «старший научный научный сотрудник»], «Преподавательский факультет»: [«лектор», «старший преподаватель», «адъюнкт-профессор»], «Non-Tenured-Track»: [«professor», «Associate research профессор», «ассистент-исследователь», «клинический профессионал», «клинический ассоциированный профессор», «клинический ассистент проф. esor " "посещение Profesor", "посещение ассоциированного Profesor", "посещение помощника Profesor"]},

"Химия": { "ординарный": [ "отличились профессор", "профессор"," ассоциированный профессор »,« доцент »], « Преподавательский факультет »: [« лектор »,« доцент »,« адъюнкт-профессор »], « Non-Tenured-Track »: [« research professaor »,« Associate research профессор »,« ассистент исследовательского профессора »,« клинический профессор »,« клинический ассоциированный специалист »,« клинический ассистент профессора »,« посещение профессора »,« приглашенный помощник профессора »,« приглашенный помощник profesor »]

}

}

Здесь я хочу связать 4 раскрывающиеся меню со значениями как: колледж: { "Машиностроение", "Наука"} Факультет: { "Электротехника", " Computer Science "}, когда выбирается колледж« Инжиниринг »и {« Физика »,« Химия »}, когда выбирается колледж« Наука ».

Кроме того, в отделе «Электротехника» мы связали {«Исследовательский персонал», «Non-tenure-track», «Professional Staff»} в раскрывающемся списке «Тип позиции» и на основании его выбора Мне нужно связать Выделение позиции Название как «научный сотрудник», «исследовательский научный сотрудник», «старший научный исследователь»}, если выбран тип позиции «Исследовательский персонал» и т. Д.

Как разобрать этот статический JSON и привязать те выпадающие списки, соответствующие выбранному значению друг друга.

+1

Google 'Java JSON parser' и вы будете иметь хорошую отправную точку. –

+0

спасибо, что это лучший ответ! @ Jean-Paul, но просто как разобрать его на стороне клиента и связать его с соответствующими выпадающими списками, которые являются моим вопросом! – Milson

+0

Вы отметили как 'Java', так и' jQuery'. На каком языке вы хотите его разобрать? –

ответ

2

Может быть проще сделать это с помощью XML. Позвольте мне предоставить вам полное решение с использованием XML. Если вы хотите попробовать свои силы, используя парсер JSON, вам придется адаптировать это решение для своих нужд. Хорошо, давайте начнем ... Во-первых, перейти на этот сайт ...

http://www.json.org/java/

... и загрузить следующие файлы в новый пакет Java под названием: org.json;

  • JSONArray.java
  • JSONException.java
  • JSONObject.java
  • JSONString.java
  • JSONStringer.java
  • JSONTokener.java
  • JSONWriter.java
  • XML.java
  • XMLTokener.java

Я сделал это сам и написал небольшую программу, чтобы преобразовать вашу строку JSON в XML :

import org.json.JSONObject; 
import org.json.XML; 

public class example { 

public static void main(String[] args) { 
    JSONObject json = new JSONObject(getJSONSting()); 
    String xml = XML.toString(json); 
    System.out.println(xml); 
} 

private static final String getJSONSting() { 
    String data = "{\"Engineering\":{ \"Electrical Engineering\":{ \"Research Staff\":[\"research associate\",\"research sciencetist\",\"senior research sciencetist\"], \"Non-tenure-track\":[\"research professaor\",\"associate research professor\",\"assistant research profesor\",\"clinical profesor\",\"clinical associate profesor\",\"clinical assistant profesor\",\"visiting profesor\",\"visiting associate profesor\",\"visiting assistant profesor\"], \"Professional Staff\":[\"business manager\",\"university research administrator\",\"department administrative assistant\"]},"; 
      data += "\"Computer Science\":{ \"Research Staff\":[\"research associate\",\"research sciencetist\",\"senior research sciencetist\"], \"Tenured\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"], \"Teaching Faculty\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"]}, \"Computer Engineering\":{\"Tenured\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"], \"Teaching Faculty\":[\"lecturer\",\"senior lecturer\",\"adjunct professor\"], \"Professional Staff\":[\"business manager\",\"university research administrator\",\"department administrative assistant\"]}"; 
      data += "},"; 
      data += "\"Science\":{ \"Physics\":{ \"Research Staff\":[\"research associate\",\"research sciencetist\",\"senior research sciencetist\"], \"Teaching Faculty\":[\"lecturer\",\"senior lecturer\",\"adjunct professor\"], \"Non-Tenured-Track\":[\"research professaor\",\"associate research professor\",\"assistant research profesor\",\"clinical profesor\",\"clinical associate profesor\",\"clinical assistant profesor\",\"visiting profesor\",\"visiting associate profesor\",\"visiting assistant profesor\"]},"; 
      data += "\"Chemistry\":{ \"Tenured\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"], \"Teaching Faculty\":[\"lecturer\",\"senior lecturer\",\"adjunct professor\"], \"Non-Tenured-Track\":[\"research professaor\",\"associate research professor\",\"assistant research profesor\",\"clinical profesor\",\"clinical associate profesor\",\"clinical assistant profesor\",\"visiting profesor\",\"visiting associate profesor\",\"visiting assistant profesor\"]}"; 
      data += "}"; 
      data += "}"; 
     return data; 
    } 
} 

Здесь он размещается в формате XML, вы заметите незаконное использование пробелов в тегах. Этот вопрос рассматривается в моем решении, так что вы можете изучить код, чтобы увидеть, как я исправил проблему ...

<Engineering> 
    <Computer Science> 
     <Tenured>distinguished professor</Tenured> 
     <Tenured>professor</Tenured> 
     <Tenured>associate professor</Tenured> 
     <Tenured>assistant professor</Tenured> 
     <Research Staff>research associate</Research Staff> 
     <Research Staff>research sciencetist</Research Staff> 
     <Research Staff>senior research sciencetist</Research Staff> 
     <Teaching Faculty>distinguished professor</Teaching Faculty> 
     <Teaching Faculty>professor</Teaching Faculty> 
     <Teaching Faculty>associate professor</Teaching Faculty> 
     <Teaching Faculty>assistant professor</Teaching Faculty> 
    </Computer Science> 
    <Electrical Engineering> 
     <Professional Staff>business manager</Professional Staff> 
     <Professional Staff>university research administrator</Professional Staff> 
     <Professional Staff>department administrative assistant</Professional Staff> 
     <Research Staff>research associate</Research Staff> 
     <Research Staff>research sciencetist</Research Staff> 
     <Research Staff>senior research sciencetist</Research Staff> 
     <Non-tenure-track>research professaor</Non-tenure-track> 
     <Non-tenure-track>associate research professor</Non-tenure-track> 
     <Non-tenure-track>assistant research profesor</Non-tenure-track> 
     <Non-tenure-track>clinical profesor</Non-tenure-track> 
     <Non-tenure-track>clinical associate profesor</Non-tenure-track> 
     <Non-tenure-track>clinical assistant profesor</Non-tenure-track> 
     <Non-tenure-track>visiting profesor</Non-tenure-track> 
     <Non-tenure-track>visiting associate profesor</Non-tenure-track> 
     <Non-tenure-track>visiting assistant profesor</Non-tenure-track> 
    </Electrical Engineering> 
    <Computer Engineering> 
     <Tenured>distinguished professor</Tenured> 
     <Tenured>professor</Tenured> 
     <Tenured>associate professor</Tenured> 
     <Tenured>assistant professor</Tenured> 
     <Professional Staff>business manager</Professional Staff> 
     <Professional Staff>university research administrator</Professional Staff> 
     <Professional Staff>department administrative assistant</Professional Staff> 
     <Teaching Faculty>lecturer</Teaching Faculty> 
     <Teaching Faculty>senior lecturer</Teaching Faculty> 
     <Teaching Faculty>adjunct professor</Teaching Faculty> 
    </Computer Engineering> 
</Engineering> 
<Science> 
    <Chemistry> 
     <Tenured>distinguished professor</Tenured> 
     <Tenured>professor</Tenured> 
     <Tenured>associate professor</Tenured> 
     <Tenured>assistant professor</Tenured> 
     <Non-Tenured-Track>research professaor</Non-Tenured-Track> 
     <Non-Tenured-Track>associate research professor</Non-Tenured-Track> 
     <Non-Tenured-Track>assistant research profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>clinical profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>clinical associate profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>clinical assistant profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>visiting profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>visiting associate profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>visiting assistant profesor</Non-Tenured-Track> 
     <Teaching Faculty>lecturer</Teaching Faculty> 
     <Teaching Faculty>senior lecturer</Teaching Faculty> 
     <Teaching Faculty>adjunct professor</Teaching Faculty> 
    </Chemistry> 
    <Physics> 
     <Non-Tenured-Track>research professaor</Non-Tenured-Track> 
     <Non-Tenured-Track>associate research professor</Non-Tenured-Track> 
     <Non-Tenured-Track>assistant research profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>clinical profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>clinical associate profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>clinical assistant profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>visiting profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>visiting associate profesor</Non-Tenured-Track> 
     <Non-Tenured-Track>visiting assistant profesor</Non-Tenured-Track> 
     <Research Staff>research associate</Research Staff> 
     <Research Staff>research sciencetist</Research Staff> 
     <Research Staff>senior research sciencetist</Research Staff> 
     <Teaching Faculty>lecturer</Teaching Faculty> 
     <Teaching Faculty>senior lecturer</Teaching Faculty> 
     <Teaching Faculty>adjunct professor</Teaching Faculty> 
    </Physics> 
</Science> 

Если вы получили это далеко, вы можете заполнить оставшуюся часть проекта путем копирования в течение следующих классов. Я протестировал решение, и он работает нормально.

Это то, что похоже на завершенное ...

enter image description here

Первый класс помещен в пакет org.combobox:

package org.combobox; 

import java.util.ArrayList; 
import java.util.List; 

import org.w3c.dom.Node; 

public class CleanNode { 

    private String _name; 
    private List<CleanNode> _nodes = new ArrayList<CleanNode>(); 

    public CleanNode(Node node) { 
    _name = node.getNodeType() == Node.TEXT_NODE ? node.getNodeValue() : node.getNodeName(); 
    } 

    private String getName() { 
    return _name; 
    } 

    public CleanNode addChild(Node node) { 
    CleanNode foundNode = null; 
    String nodeName = node.getNodeName(); 
    for(CleanNode child : _nodes){ 
     if(child.getName().equals(nodeName)) { 
     foundNode = child; 
     break; 
     } 
    } 
    if(foundNode == null) { 
     foundNode = new CleanNode(node); 
     _nodes.add(foundNode); 
    } 
    return foundNode; 
    } 

    public List<CleanNode> getNodes(){ 
    return _nodes; 
    } 

    public String toString() { 
    return _name.replace("_", " "); 
    } 
} 

Второй класс помещен в пакет org.combobox:

package org.combobox; 

import java.awt.BorderLayout; 
import java.awt.Font; 
import java.io.IOException; 
import java.io.StringReader; 
import java.util.Enumeration; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.WindowConstants; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.json.JSONObject; 
import org.json.XML; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class ComboBoxChain extends JFrame { 
    private static final long serialVersionUID = 1L; 
    private static String _xml; 
    private Node _root; 
    private CleanNode _cleanNode; 

    public ComboBoxChain() throws ParserConfigurationException, SAXException, IOException { 
    super("ComboBox Chain"); 
    setUIFont (new javax.swing.plaf.FontUIResource("Monospaced",Font.PLAIN,14)); 
    buildXML(); 
    cleanXML(); 
    _root = parse(_xml); 
    _cleanNode = new CleanNode(_root); 
    addCleanNodeChildren(_cleanNode, _root); 

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    getContentPane().add(new ComboPanel(_cleanNode), BorderLayout.CENTER); 
    pack(); 
    setResizable(false); 
    setLocationRelativeTo(null); 
    } 

    private void addCleanNodeChildren(CleanNode cleanNode, Node node) { 
    if(node.getChildNodes() != null) { 
     NodeList children = node.getChildNodes(); 
     for(int index = 0; index < children.getLength(); index++){ 
     Node child = children.item(index); 
     CleanNode cleanChild = cleanNode.addChild(child); 
     addCleanNodeChildren(cleanChild, child); 
     } 
    } 
    } 

    protected Node getRootNode() { 
    return _root; 
    } 

    private void cleanXML() { 
    String xml = _xml; 
    int beginIndex = -1; 
    int endIndex = -1; 

    for(int index = 0; index < _xml.length(); index++) { 
     if(_xml.charAt(index) == '<') { 
     beginIndex = index; 
     } 
     else if (_xml.charAt(index) == '>') { 
     endIndex = index; 
     String originalTag = _xml.substring(beginIndex, endIndex + 1); 
     String newTag = originalTag; 
     while(newTag.contains(" ")) { 
      newTag = newTag.replace(" ", "_"); 
     } 
     xml = xml.replace(originalTag, newTag); 
     } 
    } 
    _xml = xml; 
    } 

    private static final void buildXML() { 
    String data = "{\"Engineering\":{ \"Electrical Engineering\":{ \"Research Staff\":[\"research associate\",\"research sciencetist\",\"senior research sciencetist\"], \"Non-tenure-track\":[\"research professaor\",\"associate research professor\",\"assistant research profesor\",\"clinical profesor\",\"clinical associate profesor\",\"clinical assistant profesor\",\"visiting profesor\",\"visiting associate profesor\",\"visiting assistant profesor\"], \"Professional Staff\":[\"business manager\",\"university research administrator\",\"department administrative assistant\"]},"; 
    data += "\"Computer Science\":{ \"Research Staff\":[\"research associate\",\"research sciencetist\",\"senior research sciencetist\"], \"Tenured\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"], \"Teaching Faculty\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"]}, \"Computer Engineering\":{\"Tenured\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"], \"Teaching Faculty\":[\"lecturer\",\"senior lecturer\",\"adjunct professor\"], \"Professional Staff\":[\"business manager\",\"university research administrator\",\"department administrative assistant\"]}"; 
    data += "},"; 
    data += "\"Science\":{ \"Physics\":{ \"Research Staff\":[\"research associate\",\"research sciencetist\",\"senior research sciencetist\"], \"Teaching Faculty\":[\"lecturer\",\"senior lecturer\",\"adjunct professor\"], \"Non-Tenured-Track\":[\"research professaor\",\"associate research professor\",\"assistant research profesor\",\"clinical profesor\",\"clinical associate profesor\",\"clinical assistant profesor\",\"visiting profesor\",\"visiting associate profesor\",\"visiting assistant profesor\"]},"; 
    data += "\"Chemistry\":{ \"Tenured\":[\"distinguished professor\",\"professor\",\"associate professor\",\"assistant professor\"], \"Teaching Faculty\":[\"lecturer\",\"senior lecturer\",\"adjunct professor\"], \"Non-Tenured-Track\":[\"research professaor\",\"associate research professor\",\"assistant research profesor\",\"clinical profesor\",\"clinical associate profesor\",\"clinical assistant profesor\",\"visiting profesor\",\"visiting associate profesor\",\"visiting assistant profesor\"]}"; 
    data += "}"; 
    data += "}"; 

    JSONObject json = new JSONObject(data); 
    _xml = "<Root>" + XML.toString(json) + "</Root>"; 

    System.out.println(_xml); 

    } 

    private static final void setUIFont (javax.swing.plaf.FontUIResource f){ 
    Enumeration<Object> keys = UIManager.getDefaults().keys(); 
    while (keys.hasMoreElements()) { 
     Object key = keys.nextElement(); 
     Object value = UIManager.get (key); 
     if (value != null && value instanceof javax.swing.plaf.FontUIResource) { 
     UIManager.put (key, f); 
     } 
    } 
    } 

    private static final Node parse(String XMLContent) throws ParserConfigurationException, SAXException, IOException { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document document = builder.parse(new InputSource(new StringReader(XMLContent))); 
    return document.getDocumentElement(); 
    } 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     ComboBoxChain frame; 
     try { 
      frame = new ComboBoxChain(); 
      frame.setVisible(true); 
     } 
     catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } 
     catch (SAXException e) { 
      e.printStackTrace(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 
    }); 
    } 
} 

Третий класс помещен в пакет org.combobox:

package org.combobox; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 

import javax.swing.JComboBox; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ComboPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 

    private static final String DEPARTMENT = "Department"; 
    private static final String PROGRAM = "Program"; 
    private static final String FACULTY = "Faculty"; 
    private static final String ACADEMIC_RANK = "Academic Rank"; 

    private JComboBox<CleanNode> _department; 
    private JComboBox<CleanNode> _program; 
    private JComboBox<CleanNode> _faculty; 
    private JComboBox<CleanNode> _rank; 

    private DependencyLink _rankLink; 
    private DependencyLink _facultyLink; 
    private DependencyLink _programLink; 
    private DependencyLink _departmentLink; 

    public ComboPanel(CleanNode root) { 
    super(new BorderLayout()); 
    addCombos(root); 
    } 

    private void addCombos(CleanNode root) { 
    _department = new JComboBox<CleanNode>(); 
    _program = new JComboBox<CleanNode>(); 
    _faculty = new JComboBox<CleanNode>(); 
    _rank = new JComboBox<CleanNode>(); 

    _rankLink = new DependencyLink(_rank, null); 
    _facultyLink = new DependencyLink(_faculty, _rankLink); 
    _programLink = new DependencyLink(_program, _facultyLink); 
    _departmentLink = new DependencyLink(_department, _programLink); 
    _departmentLink.populate(root); 

    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout(4, 2)); 
    panel.add(new JLabel("       " + DEPARTMENT + " : ")); 
    panel.add(_department); 
    panel.add(new JLabel("        " + PROGRAM + " : ")); 
    panel.add(_program); 
    panel.add(new JLabel("        " + FACULTY + " : ")); 
    panel.add(_faculty); 
    panel.add(new JLabel("       " + ACADEMIC_RANK + " : ")); 
    panel.add(_rank); 

    add(panel, BorderLayout.CENTER); 
    } 
} 

Четвертый и последний класс помещен в пакет org.combobox:

package org.combobox; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 
import javax.swing.JComboBox; 

public class DependencyLink implements ActionListener { 

    private boolean _isLocked; 
    private JComboBox<CleanNode>_combo; 
    private DependencyLink _childLink; 
    private CleanNode _previousNode; 

    public DependencyLink(JComboBox<CleanNode>combo, DependencyLink childLink) { 
    _combo = combo; 
    _combo.addActionListener(this); 
    _childLink = childLink; 
    } 

    public void actionPerformed(ActionEvent e) { 
    CleanNode node = (CleanNode)_combo.getSelectedItem(); 
    if(node != _previousNode) { 
     updateChild(); 
     _previousNode = node; 
    } 
    } 

    private void updateChild() { 
    if(_childLink != null) { 
     if(!_isLocked) { 
     _childLink.populate((CleanNode)_combo.getSelectedItem()); 
     } 
    } 
    } 

    public void populate(CleanNode parentNode) { 
    _isLocked = true; 
    _combo.removeAllItems(); 
    if(parentNode != null) { 
     List<CleanNode> children = parentNode.getNodes(); 
     if(!children.isEmpty()) { 
     for(CleanNode childNode : children) { 
      _combo.addItem(childNode); 
     } 
     _combo.setSelectedItem(children.get(0)); 
     } 
    } 
    _isLocked = false; 
    updateChild(); 
    } 
} 

Изучите код и адаптировать его, как вам нравится для собственной реализации.

удачи, Constantin

+0

Как это сделать на стороне клиента не на стороне сервера Java? Предположим, что я получил все данные json в переменной, а затем как разобрать привязку к этим выпадающим спискам! – Milson

+1

Позвольте мне выслать вам код, который делает это в xml, я позволю вам разобраться с этим ... как это? Дайте мне несколько минут, чтобы закончить его – Constantin

+1

Красивый ответ! Очень впечатляет +1 –

Смежные вопросы