map () с массивом JSON - PullRequest
       22

map () с массивом JSON

0 голосов
/ 06 марта 2019

Не требуется решение Джексона.

Список импортов:

import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.util.List;
import java.util.stream.Collectors;

Данные JSON:

{
    "Name": "ABC.com",
    "Developer": "Vishwa ratna",
    "Project List": [
        "Compnay: National",
        "Compnay: Enterprise",
        "Compnay: Alamo"
    ]
}

Моя программа:

 @SuppressWarnings("unchecked")
    public  static  void main(String[] args)
    {
        File text = new File("R:/TestJSON.txt");
        JSONParser parser = new JSONParser();
        try {
            Object obj = parser.parse(new FileReader("R:\\Desktop\\TestJSON.txt"));
            JSONObject jsonObject = (JSONObject) obj;
            List<String> list = new ArrayList<>();
            String name = (String) jsonObject.get("Name");
            System.out.println(name);
            String author = (String) jsonObject.get("Developer");
            System.out.println(author);
            JSONArray companyList = (JSONArray) jsonObject.get("Project List");
            companyList.stream().map(e->{if(e.equals("Compnay: National")); return e;}).collect(Collectors.toList());
            list.forEach(System.out::println);
        }
        catch (Exception e)
        {}
    }
}

Все выполняется правильно, кроме

companyList.stream().map(e->{if(e.equals("Compnay: National")); return e;}).collect(Collectors.toList());
            list.forEach(System.out::println);

Я могу получить желаемый результат другим способом, ноя хочу знать, почему моя карта ничего не возвращает ??если он не вернется Compnay: National.

Результат, который я получаю:

ABC.com
Vishwa ratna

Я ожидаю:

ABC.com
Vishwa ratna
Compnay: National

Редактировать: Дажепосле использования filter(), как предлагают некоторые люди, я не могу получить желаемый результат.

Ответы [ 2 ]

5 голосов
/ 06 марта 2019
  • Один Вы должны использовать filter вместо map.
  • Секунда Вы должны присвоить результат сбора list

Ваш код должен быть:

   list = (List<String>) companyList.stream()
           .filter(e-> e.equals("Compnay: National"))
           .map(Object::toString)
           .collect(Collectors.toList());

Другое решение, возможно, состоит в том, чтобы после того, как фильтр соберет toArray, затем вы преобразуете массив в поток, используя map с Object :: toString, а затем соберете в список, это также может работать

 list = Arrays.stream(
            companyList.stream()
                 .filter(e -> e.equals("Compnay: National"))
                 .toArray())
           .map(Object::toString)
           .collect(Collectors.toList());

Почему фильтр, а не карта

map всегда возвращайте результат, поэтому, если вы делаете условие внутри map, вам нужно использовать else деталь, это работает в вашем случае, потому что у вас есть опечатка, ваше условие не делает никакого греха, но почему вы используете, если внутри map, и у вас есть filter, где вы можете избежать условий?

Stream<T> filter(Predicate<? super T> predicate)

Как вы видите filter принимает предикат и возвращает новый поток не логическое , как вы сказали в своем комментарии

1 голос
/ 06 марта 2019

Другое решение с использованием библиотеки Джексона

Я не уверен, какую библиотеку вы используете для анализа вашего Json-файла, но, похоже, это не идеальный способ, я бы предложил другое решение с использованием библиотеки jackson, поэтому у вас есть:

1 - добавить в pom.xml зависимость:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.8</version>
</dependency>

2 - создайте задание, похожее на ваш файл Json, вот так:

class MyObject {

    private String name;
    private String developer;
    private List<String> projectList;

    public String getName() {
        return name;
    }

    @JsonSetter("Name")
    public void setName(String name) {
        this.name = name;
    }

    public String getDeveloper() {
        return developer;
    }

    @JsonSetter("Developer")
    public void setDeveloper(String developer) {
        this.developer = developer;
    }

    public List<String> getProjectList() {
        return projectList;
    }

    @JsonSetter("Project List")
    public void setProjectList(List<String> projectList) {
        this.projectList = projectList;
    }
}

3 - ваш код для разбора

import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

public class Mcve {

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

        String path = "R:\\Desktop\\TestJSON.txt";
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        MyObject obj = mapper.readValue(new File(path), MyObject.class);

        String name = obj.getName();
        System.out.println(name);
        String author = obj.getDeveloper();
        System.out.println(author);

        List<String> list = obj.getProjectList()
                .stream()
                .filter(e -> e.equals("Compnay: National"))
                .collect(Collectors.toList());
        list.forEach(System.out::println);

    }
}

Выходы

ABC.com
Vishwa ratna
Compnay: National

Как видите, работать с объектами проще и полезнее.

...