Многоуровневое сопоставление со структурой Json в Java

#java #json #collections #multi-level

#java #json #Коллекции #многоуровневый

Вопрос:

Я пытаюсь преобразовать многоуровневую карту в Json, где уровень карты может быть любым. Например

У меня есть карта, подобная

 
    Map m = new LinkedHashMap();
    m.put("data.test[1].tool",6);
    m.put("data.test[1].sets",8);
    m.put("data.test[2].tool",9);
    m.put("data.test[2].sets",12);
    
    m.put("data.tem[1].use[1]",6);
    m.put("data.tem[1].use[2]",9);
    
    m.put("data.tut.seh",6)

  

Я хочу преобразовать это в

 {
  "data": {
    "test": [
      {
        "tool": 6,
        "sets": 8
      },
      {
        "tool": 9,
        "sets": 12
      }
    ],
    "tem": [
      {
        "use": [
          6,
          9
        ]
      }
    ],
    "tut": {
      "seh": 6
    }
  }
}
  

Что-то вроде правильного json, который также поддерживает порядок, например, значения 6 и 8 принадлежат первому индексу теста, поэтому они должны быть первыми, а второй массив должен содержать 9 и 12 внутри тестового массива. Поскольку этот json будет использоваться позже для получения точного значения на основе индекса.

Если кто-то может дать мне какую-то идею. Заранее спасибо.

Комментарии:

1. Почему вы put вводите JSONPaths в карту вместо построения карты для представления структуры объекта (т. Е. Имеете «многоуровневую» карту)?

2. Можете ли вы поделиться тем, что вы пробовали?

3. Не используйте «data.test[1].tool» в качестве ключа. Вместо этого проанализируйте эту строку и создайте для сопоставления.

4. Извините за путаницу. На самом деле я не помещаю эти значения в Карту. Здесь я просто создавал карту, чтобы показать, как будут выглядеть значения. Карта, такие значения которой я получаю из какой-то другой функции, которую я не мог контролировать, чтобы изменить ее.

Ответ №1:

Вы можете попробовать использовать класс Bean для хранения данных и получить их оттуда, меня пробовали как там, это может вам помочь!

 import java.util.*;
public class Test {
public static  void main(String[] args){
    System.out.println("Hello World");
   /* your code
    Map m = new LinkedHashMap();
    m.put("data.test[1].tool",6);
    m.put("data.test[1].sets",8);
    m.put("data.test[2].tool",9);
    m.put("data.test[2].sets",12);

    m.put("data.tem[1].use[1]",6);
    m.put("data.tem[1].use[2]",9);

    m.put("data.tut.seh",6);

    System.out.println(m);
   */

    Map m1 = new LinkedHashMap();
    List<String> list = new ArrayList<String>();
    list.add("listItem1");
    m1.put(new BeanToMap("withList",list),"mapValueWithList");
    m1.put(new BeanToMap("test"),"test");

    System.out.println(m1);



   }


}
  

Класс Bean — это :

    import java.util.*;
   public class BeanToMap {
   private String name;
   private List<String> cars = new ArrayList<String>();

    public String getName() {
        return name;
    }

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

    public BeanToMap(String name, List<String> cars) {
        this.name = name;
        this.cars = cars;
    }

    public BeanToMap(String name) {
        this.name = name;
    }

    public List<String> getCars() {
        return cars;
    }

    public void setCars(List<String> cars) {
        this.cars = cars;
    }
  }
  

вы можете установить все значения в строку, затем вы можете использовать

 JSONObject json = new JSONObject();