Как сопоставить json объект с java объектом в apache искре - PullRequest
0 голосов
/ 01 мая 2020

У меня есть следующий json объект, и я хочу отобразить этот json в java объект, пожалуйста, помогите мне.

{
  "address": {
    "building": "1007",
    "coord": [
      -73.856077,
      40.848447
    ],
    "street": "Morris Park Ave",
    "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
    {
      "date": {
        "$date": 1393804800000
      },
      "grade": "A",
      "score": 2
    },
    {
      "date": {
        "$date": 1378857600000
      },
      "grade": "A",
      "score": 6
    },
    {
      "date": {
        "$date": 1358985600000
      },
      "grade": "A",
      "score": 10
    },
    {
      "date": {
        "$date": 1322006400000
      },
      "grade": "A",
      "score": 9
    },
    {
      "date": {
        "$date": 1299715200000
      },
      "grade": "B",
      "score": 14
    }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
}

Когда я использую scala метод printschema, он показывает как показано ниже, Пожалуйста, помогите мне сопоставить эту схему с java объектом.

root
 |-- address: struct (nullable = true)
 |    |-- building: string (nullable = true)
 |    |-- coord: array (nullable = true)
 |    |    |-- element: double (containsNull = true)
 |    |-- street: string (nullable = true)
 |    |-- zipcode: string (nullable = true)
 |-- borough: string (nullable = true)
 |-- cuisine: string (nullable = true)
 |-- grades: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- date: struct (nullable = true)
 |    |    |    |-- $date: long (nullable = true)
 |    |    |-- grade: string (nullable = true)
 |    |    |-- score: long (nullable = true)
 |-- name: string (nullable = true)
 |-- restaurant_id: string (nullable = true)

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Если вы хотите преобразовать json строку в java, вы можете использовать Gson ..

Gson g = new Gson(); yourvenillabean p = g.fromJson(jsonString, yourvanillabean.class)

см. Полный пример здесь

Подробнее здесь


с тех пор, как вы добавили спаг-тег Если я прав, ниже приведен искровой способ обработки json, если вы хотите создать фрейм данных ...

вы можете конвертировать это json в DataFrame, как показано ниже

package examples;


import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.SparkSession;

import java.util.Arrays;
import java.util.List;

public class JsonDF {

    SparkSession sparkSession;

    public static void main(String[] args) {


 SparkConf conf = new SparkConf();
        conf.setMaster("local[2]");


        SparkSession spark = SparkSession
                .builder()
                .appName("Dataset-json")
                .master("local[4]")
                .getOrCreate();
        System.out.println("Session created");
        String str = "{\n" +
                "  \"address\": {\n" +
                "    \"building\": \"1007\",\n" +
                "    \"coord\": [\n" +
                "      -73.856077,\n" +
                "      40.848447\n" +
                "    ],\n" +
                "    \"street\": \"Morris Park Ave\",\n" +
                "    \"zipcode\": \"10462\"\n" +
                "  },\n" +
                "  \"borough\": \"Bronx\",\n" +
                "  \"cuisine\": \"Bakery\",\n" +
                "  \"grades\": [\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1393804800000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 2\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1378857600000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 6\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1358985600000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 10\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1322006400000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 9\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1299715200000\n" +
                "      },\n" +
                "      \"grade\": \"B\",\n" +
                "      \"score\": 14\n" +
                "    }\n" +
                "  ],\n" +
                "  \"name\": \"Morris Park Bake Shop\",\n" +
                "  \"restaurant_id\": \"30075445\"\n" +
                "}";
        List<String> data = Arrays.asList(str);

        Dataset<String> ds = spark.createDataset(data, Encoders.STRING());
        spark.read().json(ds).show(false);


    }
}

Результат:

+-------------------------------------------------------+-------+-------+-------------------------------------------------------------------------------------------------------------------------------+---------------------+-------------+
|address                                                |borough|cuisine|grades                                                                                                                         |name                 |restaurant_id|
+-------------------------------------------------------+-------+-------+-------------------------------------------------------------------------------------------------------------------------------+---------------------+-------------+
|[1007, [-73.856077, 40.848447], Morris Park Ave, 10462]|Bronx  |Bakery |[[[1393804800000], A, 2], [[1378857600000], A, 6], [[1358985600000], A, 10], [[1322006400000], A, 9], [[1299715200000], B, 14]]|Morris Park Bake Shop|30075445     |
+-------------------------------------------------------+-------+-------+-------------------------------------------------------------------------------------------------------------------------------+---------------------+-------------+


ОБНОВЛЕНИЕ:

Поскольку вы хотите преобразовать json в java класс, который вы можете использовать это чтобы сделать это с вашей json строкой ...

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

public class Application {
  Address AddressObject;
  private String borough;
  private String cuisine;
  ArrayList<Object> grades = new ArrayList<Object>();
  private String name;
  private String restaurant_id;


 // Getter Methods 

  public Address getAddress() {
    return AddressObject;
  }

  public String getBorough() {
    return borough;
  }

  public String getCuisine() {
    return cuisine;
  }

  public String getName() {
    return name;
  }

  public String getRestaurant_id() {
    return restaurant_id;
  }

 // Setter Methods 

  public void setAddress( Address addressObject ) {
    this.AddressObject = addressObject;
  }

  public void setBorough( String borough ) {
    this.borough = borough;
  }

  public void setCuisine( String cuisine ) {
    this.cuisine = cuisine;
  }

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

  public void setRestaurant_id( String restaurant_id ) {
    this.restaurant_id = restaurant_id;
  }
}
public class Address {
  private String building;
  ArrayList<Object> coord = new ArrayList<Object>();
  private String street;
  private String zipcode;


 // Getter Methods 

  public String getBuilding() {
    return building;
  }

  public String getStreet() {
    return street;
  }

  public String getZipcode() {
    return zipcode;
  }

 // Setter Methods 

  public void setBuilding( String building ) {
    this.building = building;
  }

  public void setStreet( String street ) {
    this.street = street;
  }

  public void setZipcode( String zipcode ) {
    this.zipcode = zipcode;
  }
}

, который совместим с искрой схема, которую вы получили ..

root
 |-- address: struct (nullable = true)
 |    |-- building: string (nullable = true)
 |    |-- coord: array (nullable = true)
 |    |    |-- element: double (containsNull = true)
 |    |-- street: string (nullable = true)
 |    |-- zipcode: string (nullable = true)
 |-- borough: string (nullable = true)
 |-- cuisine: string (nullable = true)
 |-- grades: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- date: struct (nullable = true)
 |    |    |    |-- $date: long (nullable = true)
 |    |    |-- grade: string (nullable = true)
 |    |    |-- score: long (nullable = true)
 |-- name: string (nullable = true)
 |-- restaurant_id: string (nullable = true)

Вот пример Как создать Dataframe в искре, который содержит сложные Java Beans

1 голос
/ 02 мая 2020

Я предполагаю, что целью является создание Java объекта из json String. Он будет длинным, но довольно простым в реализации. Это решение основано на API-интерфейсе Jackson. Основной API, используемый для привязки данных, - это API-интерфейс Jackson.

Шаг 1. Включите Джексона в зависимость maven, если вы используете pom. xml В противном случае загрузите соответствующие файлы jar из репозитория maven. https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.1</version>
    </dependency>
  </dependencies>

Шаг 2: Создание классов POJO. Этот объект будет создан из JSON.

Нам нужны POJO для ниже и возьмем структура ниже,

         AddressDetails  
           Address
           Grades  
             Grade   
               Date

Я добавлю код для POJO снизу вверх.

Дата:

package org.personal.TestProject.jsontoobject;

public class Date {
    private float $date;

    // Getter Methods
    public float get$date() {
        return $date;
    }

    // Setter Methods
    public void set$date(float $date) {
        this.$date = $date;
    }
}

Оценка:

package org.personal.TestProject.jsontoobject;

    public class Grade {

        Date date = new Date();
        private String grade;
        private float score;

        // Getter Methods
        public float getScore() {
            return score;
        }
        public String getGrade() {
            return grade;
        }
        public Date getDate() {
            return date;
        }

        // Setter Methods
        public void setScore(float score) {
            this.score = score;
        }
        public void setGrade(String grade) {
            this.grade = grade;
        }

        public void setDate(Date date) {
            this.date = date;
        }
    }

Оценки:

package org.personal.TestProject.jsontoobject;

import java.util.ArrayList;
import java.util.List;
import org.personal.TestProject.jsontoobject.Grade;

public class Grades {

    private List<Grade> grades = new ArrayList<Grade>();

    public List<Grade> getGrades() {
        return grades;
    }

    public void setGrades(List<Grade> grades) {
        this.grades = grades;
    }
}

Адрес:

package org.personal.TestProject.jsontoobject;
import java.util.ArrayList;
import java.util.List;

public class Address {
    private String building;
    List<Float> coord = new ArrayList<Float>();
    private String street;
    private String zipcode;


    // Getter Methods

    public String getBuilding() {
        return building;
    }
    public List<Float> getCoords() {
        return coord;
    }

    public String getStreet() {
        return street;
    }
    public String getZipcode() {
        return zipcode;
    }

    // Setter Methods
    public void setBuilding(String building) {
        this.building = building;
    }
    public void setCoord(List<Float> coord) {
        this.coord = coord;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }
}

AddressDetails:

package org.personal.TestProject.jsontoobject;

import java.util.ArrayList;
import java.util.List;
import org.personal.TestProject.jsontoobject.Grade;
import org.personal.TestProject.jsontoobject.Address;

public class AddressDetails {

    Address address = new Address();
    private String borough;
    private String cuisine;
    List<Grade> grades = new ArrayList<Grade>();
    private String name;
    private String restaurant_id;

    //Setters
    public List<Grade> getGrades() {
        return grades;
    }
    public Address getAddress() {
        return address;
    }
    public String getBorough() {
        return borough;
    }
    public String getCuisine() {
        return cuisine;
    }
    public String getName() {
        return name;
    }
    public String getRestaurant_id() {
        return restaurant_id;
    }

    //Getters
    public void setGrades(List<Grade> grades) {
        this.grades = grades;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public void setBorough(String borough) {
        this.borough = borough;
    }  
    public void setCuisine(String cuisine) {
        this.cuisine = cuisine;
    }    
    public void setName(String name) {
        this.name = name;
    }   
    public void setRestaurant_id(String restaurant_id) {
        this.restaurant_id = restaurant_id;
    }
}

Шаг 3: Мы используем ObjectMapper для преобразования json (файл или строка) в Object.Now вы можете использовать геттеры для доступа к полям из объекта по желанию.

package org.personal.TestProject.jsontoobject;

        import java.io.File;
        import java.util.ArrayList;
        import java.util.List;

        import com.fasterxml.jackson.databind.ObjectMapper;
        import org.personal.TestProject.jsontoobject.AddressDetails;

public class ReadJsonFile {

    public static void main(String args[]){

        ObjectMapper mapper = new ObjectMapper();

        String json = "{\n" +
                "  \"address\": {\n" +
                "    \"building\": \"1007\",\n" +
                "    \"coord\": [\n" +
                "      -73.856077,\n" +
                "      40.848447\n" +
                "    ],\n" +
                "    \"street\": \"Morris Park Ave\",\n" +
                "    \"zipcode\": \"10462\"\n" +
                "  },\n" +
                "  \"borough\": \"Bronx\",\n" +
                "  \"cuisine\": \"Bakery\",\n" +
                "  \"grades\": [\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1393804800000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 2\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1378857600000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 6\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1358985600000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 10\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1322006400000\n" +
                "      },\n" +
                "      \"grade\": \"A\",\n" +
                "      \"score\": 9\n" +
                "    },\n" +
                "    {\n" +
                "      \"date\": {\n" +
                "        \"$date\": 1299715200000\n" +
                "      },\n" +
                "      \"grade\": \"B\",\n" +
                "      \"score\": 14\n" +
                "    }\n" +
                "  ],\n" +
                "  \"name\": \"Morris Park Bake Shop\",\n" +
                "  \"restaurant_id\": \"30075445\"\n" +
                "}";

        AddressDetails value = null;
        try {
            value = mapper.readValue(json, AddressDetails.class);
             // For converting a json file to object use below code
            //value = mapper.readValue(new File("result.json"), AddressDetails.class);
            // Use getter methods to Access any fields on the object
            System.out.println("Restaurant ID " +value.getRestaurant_id());
        } catch (Exception e) {
            e.printStackTrace();
        }     
    }

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...