Извлечение JSON ключей из двумерной матрицы - PullRequest
1 голос
/ 21 января 2020

При работе с действительным JSON, который представляет собой двумерную матрицу:

[ { "a":1, "b":2 }, { "b":3, "c":4 }, { "c":6, "a":5 } ]

Используя Java 1.8 и json -простую библиотеку:

<dependency>
  <groupId>com.googlecode.json-simple</groupId>
  <artifactId>json-simple</artifactId>
  <version>1.1.1</version>
</dependency>

Может ли получить отдельную строку, используя следующее?:

JSONParser parser = new JSONParser();
Object obj = parser.parse(args[0]);
JSONArray array = (JSONArray) obj;
System.out.println(array.get(0));

Это выводит:

{"a":1,"b":2}

Мой вопрос заключается в том, как извлечь значения ключа из этой двухмерной матрицы для вывода этого :

'{ "a": [1,null,5], "b": [2,3,null], "c": [null,4,6] }'

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

Ответы [ 3 ]

1 голос
/ 22 января 2020

Общее решение может выглядеть следующим образом:

  1. Считать JSON полезную нагрузку как ARRAY .
  2. Найти все возможные ключи во всех JSON Object в ARRAY и сохраните их в наборе KEYS .
  3. Переберите все JSON Object в ARRAY .
  4. Переберите все КЛЮЧИ и получите значение или null из заданного JSON Object.

Используя функции Java 8, мы можем реализовать его как показано ниже:

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class JsonSimpleApp {
    public static void main(String[] args) throws ParseException {
        // input
        String json = "[ { \"a\":1, \"b\":2 }, { \"b\":3, \"c\":4 }, { \"c\":6, \"a\":5 } ]";

        // read as JSONArray
        JSONParser parser = new JSONParser();
        JSONArray array = (JSONArray) parser.parse(json);

        // Find all possible keys
        Set<String> keys = (Set<String>) array.stream().flatMap(i -> ((JSONObject) i).keySet().stream()).collect(Collectors.toSet());

        // create result Map with KEY - LIST pair
        Map<String, List<Object>> result = new HashMap<>();
        keys.forEach(key -> result.put(key, new ArrayList<>()));

        // Iterate over all JSONObject's
        array.forEach(item -> {
            JSONObject object = (JSONObject) item;
            // For each possible key add a value or NULL to each list
            keys.forEach(key -> result.get(key).add(object.remove(key)));
        });

        result.entrySet().forEach(System.out::println);
    }
}

Над отпечатками кода:

a=[1, null, 5]
b=[2, 3, null]
c=[null, 4, 6]
0 голосов
/ 21 января 2020

Отредактировано

Просто вы можете использовать JOLT для этой цели.

JSON для JSON библиотека преобразований, написанная на Java, где "спецификацией" для преобразования является сам JSON документ.

В соответствии с вашим сценарием вы должны просто:

1- Создать правило

2- Отфильтровать входные данные с помощью этого правила.


  • Вход JSON выглядит следующим образом
[
  {
    "a": 1,
    "b": 2
  },
  {
    "b": 3,
    "c": 4
  },
  {
    "c": 6,
    "a": 5
  }
]
  • Правило фильтра (JOLT spe c) может быть следующим
[
   {
     "operation": "shift",
     "spec": {

       "*": {
         "a": "a",
         "b": "b",
         "c": "c"
       }

     }
   }
]
  • результат
{
  "a" : [ 1, 5 ],
  "b" : [ 2, 3 ],
  "c" : [ 4, 6 ]
}

Вы можете проверить вышеупомянутое решение в здесь


  • Java код для применения вышеупомянутых пунктов в java
public class CustomJsonTransformer {

    public static void main(String[] args) throws Exception {

        //Get filter (JOLT SPEC)
        List<Object> specs = JsonUtils.classpathToList("/filter.json");
        Chainr chainr = Chainr.fromSpec(specs);

        //Get input JSON
        Object inputJSON = JsonUtils.classpathToObject("/input.json");

        //Do filter
        Object transformedOutput = chainr.transform(inputJSON);

        //Result
        System.out.println(JsonUtils.toPrettyJsonString(transformedOutput));
    }
}

1- В этом руководстве показан довольно хороший пример JOLT в java

2- Полная документация JOLT здесь

Обратите внимание, что с помощью JOLT документации вы можете сделать правило более сложным или простым (мое правило было простым)

0 голосов
/ 21 января 2020

Вы можете войти в json по ключу. Например:

obj["key"][0]

Тогда вы можете принять значение

...