2
votes

Comment analyser l'arborescence jsonarray imbriquée complexe en Java

J'ai un tableau JSON comme celui-ci:

[
    {name:"com"},
    {"name":"project"},
    {"name":"server"},
    {"name":"client"},
    {"name":"util"}]

Et j'ai besoin de tous les noms de tous les objets JSON. Y a-t-il un moyen de faire cela en java?

Je veux une fonction récursive.

Mon résultat attendu est comme:

[{
  "name": "com",
  "children": [
    {
      "name": "project",
      "children": [
        {
          "name": "server"
        },
        {
          "name": "client",
          "children": [
            {
              "name": "util"
            }
          ]
        }
      ]
    }
  ]
}]


5 commentaires

Qu'est-ce que tu as essayé jusque-là? Pourquoi ça n'a pas marché?


JSONArray ja = new JSONArray (myarray); JSONObject jo = ja.getJSONObject (0); System.out.println (jo.getString ("nom")); En fait, j'essaie comme ça, donc son type de solution de contournement je veux une fonction qui lit les tableaux imbriqués dans le tableau


et mes données sont dynamiques, donc je ne sais pas combien d'objets json sont ajoutés dans le tableau des enfants, c'est pourquoi je veux une fonction générique qui réduit mes efforts


vous avez supprimé un peu rapidement cette autre question. jetez un œil à stackoverflow.com/questions/4216745/… ... ce que je ferais: utilisez simplement String.substring () pour récupérer les X premiers caractères de chaque ligne. X serait le nombre dont vous savez que vos horodatages ont besoin. Essayez ensuite d'analyser cette chaîne comme date. si cela fonctionne bien, sinon, vous avez autre chose sur cette ligne.


Mais comprenez bien: ce sont des choses vraiment basiques, et vous ne devriez pas venir ici et seulement afficher les exigences "voici ce dont j'ai besoin", avec zéro efforts pour résoudre le problème toi même. Veuillez comprendre: nous vous aidons à résoudre les problèmes , nous ne les résolvons pas pour vous. enfin: faites attention: vous avez déjà des questions avec des scores négatifs, si vous continuez comme ça, vous pourriez être banni de poser des questions. Alors, s'il vous plaît: ne venez pas ici et vous attendez à ce que les gens vous montrent des choses super basiques. Les choses qui ont été posées ont répondu ici plusieurs fois auparavant.


3 Réponses :


1
votes

Essayez simplement de déclencher les "[" et "]". Passez récursivement une chaîne qui peut ajouter les parties utiles coupées du json au nouveau format. À la fin, vous pouvez retourner cette chaîne à l'appel d'origine .. lorsque la récursive se termine.

J'écrivais un exemple pour votre cas spécifique mais en C #, et cela semble être plus facile sans récursivité.

   public string GetNames(string originalJson)
        {
            string namesString = "[";
            bool newItem = false;

            for(int i = 0; i < originalJson.Length; i++ )
            {                
                if(newItem)
                {
                    if (originalJson[i] == ',')
                    {
                        newItem = false;
                        namesString += "}";
                    }

                    else
                        namesString += originalJson[i];

                }
                else if (originalJson[i] == '{')
                {
                    newItem = true;
                    namesString += "{";
                }


            }
            namesString = namesString.Substring(0, namesString.Length - 1);
            namesString += "]";
            return namesString;
        }

Je ne sais pas si c'est ce que vous recherchez.


0 commentaires

1
votes

Ceci est une fonction récursive simple pour obtenir toutes les propriétés de noms de votre tableau json:

public static JSONArray getNames(JSONArray inputArray, JSONArray outputArray) {
    for (int i = 0; i < inputArray.length(); i++) {
        JSONObject inputObject = inputArray.getJSONObject(i);

        JSONObject outputObject = new JSONObject();
        outputObject.put("name", inputObject.getString("name"));
        outputArray.put(outputObject);

        if (inputObject.has("children")) {
            JSONArray children = inputObject.getJSONArray("children");
            getNames(children, outputArray);
        }
    }

    return outputArray;
}

Cela vous fournira une liste de noms que vous pouvez utiliser pour construire un nouveau tableau json. Une solution possible est la suivante:

 public static JSONArray getJsonArraysOfNames(List<String> names) {
    JSONArray jsonArray = new JSONArray();
    for (String name : names) {
        JSONObject object = new JSONObject();
        object.put("name", name);
        jsonArray.put(object);
    }

    return jsonArray;
}

MISE À JOUR

Si vous préférez une solution tout-en-un , vous pouvez y aller avec cette approche:

public static Collection<String> getAllNames(JSONArray jsonArray, List<String> names) {
    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject object = jsonArray.getJSONObject(i);
        names.add(object.getString("name"));
        if (object.has("children")) {
            JSONArray children = object.getJSONArray("children");
            getAllNames(children, names);
        }
    }

    return names;
}


0 commentaires

2
votes

A écrit un petit programme pour résoudre votre problème.

Une Entité de type récursive qui a 2 attributs, "nom" de type Chaîne et "enfants" de type Liste . Puisque c'est la structure de votre JSON paisible. Le JSON peut alors être facilement analysé à l'aide de l'API Jackson sur une seule ligne

import java.util.List;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public  class Entity {

    String name;
    List<Entity> children;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Entity> getChildren() {
        return children;
    }

    public void setChildren(List<Entity> children) {
        this.children = children;
    }}

Après avoir créé avec succès l'objet, tout ce que nous devons faire est de le parcourir récursivement à travers la hiérarchie et à chaque étape renvoie l'attribut name avec du texte supplémentaire qui donne au résultat un formulaire JSON valide. Code ci-dessous.

Main.java

import java.io.IOException;
import java.util.List;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class Main {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

    String json = "[{\"name\":\"com\",\"children\":[{\"name\":\"project\",\"children\":[{\"name\":\"server\"},{\"name\":\"client\",\"children\":[{\"name\":\"util\"}]}]}]}]";

    ObjectMapper mapper = new ObjectMapper();
    List<Entity> clas = mapper.readValue(json,
            mapper.getTypeFactory().constructCollectionType(List.class, Entity.class));

    String names = getChildren(clas);
    String result = "[" + names.substring(0, names.length() - 1) + "]";

    System.out.println(result);
}

private static String getChildren(List<Entity> clas) {
    String names = "";
    for (Entity class1 : clas) {
        if (class1.getChildren() == null) {
            names += "{name : \"" + class1.getName() + "\"},";
            if (clas.indexOf(class1) == (clas.size() - 1)) {
                return names;
            }
            continue;
        }
        names += "{name : \"" + class1.getName() + "\"},";

        names += getChildren(class1.getChildren());
    }
    return names;
}
}

Entity.java

XXX


0 commentaires