Разделение на JSON Payload с Regex для получения значения - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь получить значение из частичной полезной нагрузки JSON, просто используя метод split. Я могу использовать только этот метод, так как этот API очень ограничен. Я могу получить свою ценность, используя Pattern и Match API.

package com.company;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {

    public static void main(String[] args) {
        // write your code here
        String myString = "{\n" +
                "  \"8\": [\n" +
                "    {\n" +
                "      \"TEST\": \"LN17ELJ\",\n" +
                "      \"ROUTE_UNIQUE_ID_REFERENCE\": \"2172752\",\n" +
                "      \"ORDER_UNIQUE_ID_REFERENCE\": \"109197634\",\n" +
                "      \"STATUS\": \"HORLEY\",\n" +
                "      \"SECONDARY_NAV_CITY\": \"HORLEY\",\n" +
                "      \"ROUTE\": \"THE STREET 12\",\n";


        String myRegexPattern = "\"([ROUTE_UNIQUE_ID_REFERENCE\"]+)\"\\s*:\\s*\"([^\"]+)\",?";

        Pattern pattern = Pattern.compile(myRegexPattern);

        Matcher matcher = pattern.matcher(myString);


        if (matcher.find())
        {
            System.out.println(matcher.group(2));
        } else {
            System.out.println("Didn't work!");
        }
    }
}

Тем не менее, Когда я пытаюсь использовать String.split, он не работает, и мое значение отсутствует ни в одном из индексов массива.

package com.company;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {

    public static void main(String[] args) {
        // write your code here
        String myString = "{\n" +
                "  \"8\": [\n" +
                "    {\n" +
                "      \"TEST\": \"LN17ELJ\",\n" +
                "      \"ROUTE_UNIQUE_ID_REFERENCE\": \"2172752\",\n" +
                "      \"ORDER_UNIQUE_ID_REFERENCE\": \"109197634\",\n" +
                "      \"STATUS\": \"HORLEY\",\n" +
                "      \"SECONDARY_NAV_CITY\": \"HORLEY\",\n" +
                "      \"ROUTE\": \"THE STREET 12\",\n";


        String myRegexPattern = "\"([ROUTE_UNIQUE_ID_REFERENCE\"]+)\"\\s*:\\s*\"([^\"]+)\",?";

        String[] newValue = myString.split(myRegexPattern);

        for(int i = 0; i < newValue.length; i++) {
            if(newValue[i].equals("2172752")) {
                System.out.println("IT'S HERE!");
            }
        }

    }
}

Каков наилучший способ сделать это? Есть ли лучший способ получить ROUTE_UNIQUE_ID_REFERENCE, просто используя split ??

1 Ответ

0 голосов
/ 19 июня 2019
  1. Ваше регулярное выражение не делает то, что вы ожидаете. Это не соответствует "ROUTE_UNIQUE_ID_REFERENCE":"...",, но соответствует любому ключу, который начинается с любой из букв в ROUTE_UNIQUE_ID_REFERENCE. Вы можете заменить его на что-то вроде \"ROUTE_UNIQUE_ID_REFERENCE[\"\\s:]+([^\",]+), которое будет соответствовать тому, что вы хотите в группе соответствия 1.

  2. Функция разделения не работает так, как вы ожидаете. Регулярное выражение, которое вы используете в разбиении, рассматривается как разделитель. Таким образом он удаляет данные, которые вы надеетесь извлечь.

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

  1. Вам нужно исправить свое регулярное выражение и соответствующую группу
  2. Используйте цикл while вместо оператора if, чтобы найти все экземпляры
    String myRegexPattern = "\"ROUTE_UNIQUE_ID_REFERENCE[\"\\s:]+([^\",]+)";
    Pattern pattern = Pattern.compile(myRegexPattern);
    Matcher matcher = pattern.matcher(myString);

    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
...