Как сохранить содержимое проанализированного сообщения JSON в строковых переменных на основе ключевых слов?

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

Name: Kobe Bryant<br/>
Company: Lakers<br/>
Email: [email protected]<br/>
etc.

Я хочу иметь возможность посмотреть на этот блок теста, увидеть, что там написано «Имя: Коби Брайант», и сохранить Коби Брайанта в строковой переменной с именем «имя» и так далее. Как я могу справиться с этим?

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

        String name;
        String company;
        String email;
        String phoneNumber;
        String projectType;
        String contactBy;
        String timeFrame;
        String message;

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

        MainParser mp = mapper.readValue(new File("/Users/kane/VersionControl/LambdaTest/src/InfoBox.txt"), MainParser.class);

        if ("blah".equals(mp.getTopicArn())) {
            //Send to proposal table
            System.out.println(mp.getSubject());
            System.out.println(mp.getMessage());
        } else if ("blah blah".equals(mp.getTopicArn())) {
            //Send to infoBox table
            System.out.println(mp.getMessage());
        }
    }
}

JSON, который я разбираю:

{
 "Subject" : "Proposal Request (sent Wed May 22 2019 14:47:49 GMT-0400 (Eastern Daylight Time))",
 "Message" : "Name: Kobe Bryant\nCompany: Lakers\nEmail: [email protected]"
}

Вот класс POJO:

private String Subject;
private String Message;

public String getSubject() {
    return Subject;
}

public void setSubject(String subject) {
    Subject = subject;
}

public String getMessage() {
    return Message;
}

public void setMessage(String message) {
    Message = message;
}

person Kane    schedule 24.05.2019    source источник
comment
Ключ "Message" не содержит допустимого объекта JSON. А просто текст, который выглядит так: "Name: Kobe Bryant\nCompany: Lakers\nEmail: [email protected]". Таким образом, каждая пара key-value отделяется новой строкой. Не могли бы вы это подтвердить?   -  person Michał Ziober    schedule 25.05.2019
comment
@MichałZiober Извините за столь поздний ответ, но да, вы правы. Каждая строка отделяется новой строкой.   -  person Kane    schedule 28.05.2019


Ответы (1)


У вас есть полезная нагрузка JSON, в которой одно из значений содержит данные в key:value парах, разделенных новой строкой \n. Нам нужно создать два класса POJO: Message для корня JSON и Person - внутренние данные человека. Эти два класса могут выглядеть так:

class Message {

    private String subject;
    private String message;

    // getters, setters, toString
}

class Person {

    private String name;
    private String company;
    private String email;

    // ... more properties

    // getters, setters, toString
}

Мы можем проанализировать вашу полезную нагрузку JSON, как показано ниже:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;

import java.io.File;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);

        Message message = mapper.readValue(jsonFile, Message.class);
        String[] lines = message.getMessage().split("\n");

        Map<String, String> properties = Stream.of(lines)
                .map(i -> i.split(":"))
                .filter(i -> i.length == 2)
                .collect(Collectors.toMap(i -> i[0].trim(), i -> i[1].trim()));

        Person person = mapper.convertValue(properties, Person.class);
        System.out.println(person);
    }
}

Вышеприведенный пример печатает для полезной нагрузки JSON:

Person{name='Kobe Bryant', company='Lakers', email='[email protected]'}

Как видите, мы создали Map из внутренних данных и использовали convertValue для преобразования класса Map в класс Person.

Смотрите также:

  1. Java 8 — преобразование списка в карту
  2. Как десериализовать карту в POJO?
  3. Как сериализовать в java.util.List и java.util.Map с Джексоном
person Michał Ziober    schedule 28.05.2019
comment
Спасибо! Пробую это сейчас. - person Kane; 31.05.2019