Как получить вложенный объект JSON с модернизацией? - PullRequest
0 голосов
/ 03 апреля 2019

Я использую модификацию для извлечения объекта json. Однако мне было интересно, есть ли простой способ извлечь вложенные объекты.

Вот моя строка JSON:

{
  "name": "125 8th avenue",
  "address": "125 8th avenue, San fran ,CA 09012",
  "location": {
    "lon": -72.98013329999998,
    "lat": 45.7552112
  },
  "email": "support@email.com",
  "primaryContact": {
    "firstName": "john",
    "lastName": "doe",
    "jobTitle": "General Manager, 8th Ave",
    "email": "support@email.com",
    "photo": "//images.ctfassets.net/qykmdxxsgb04/3EaIeJ29djgo6Exve4Q7xb.jpeg"
  }

Я получаю имя и адрес электронной почты как:

@Expose
    @SerializedName("name")
    private String name;

    @Expose
    @SerializedName("email")
    private String email;

public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof MyInfo)) return false;

        MyInfo that = (MyInfo) o;

        if (!name.equals(that.name)) return false;


    }
@Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + email.hashCode();
return result;
}

Как вы видите из JSON, довольно просто получить имя и адрес электронной почты, но не знаете, как я могу легко получить данные primaryContact (скажем, имя и фамилия) в одном файле? Есть идеи?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Два способа:

  1. сделать контакт и местоположение внутренним классом (тот же файл), но к полям все равно будет нелегко получить доступ извне.

  2. вместо этого вы можете создать метод для доступа к атрибутам в контактах из адреса.

Я использую http://www.jsonschema2pojo.org/ для автоматического создания файлов ниже

public class Address {

    // create a method here to get first/last name
    public String getFirstName(){ 
        return primaryContact==null? "" : 
               primaryContact.getFirstName(); 
    }
    // do the same for which ever inner attributes you like to access.

@SerializedName("name")
@Expose
private String name;
@SerializedName("address")
@Expose
private String address;
@SerializedName("location")
@Expose
private Location location;
@SerializedName("email")
@Expose
private String email;
@SerializedName("primaryContact")
@Expose
private PrimaryContact primaryContact;

public String getName() {
return name;
}

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

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public Location getLocation() {
return location;
}

public void setLocation(Location location) {
this.location = location;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public PrimaryContact getPrimaryContact() {
return primaryContact;
}

public void setPrimaryContact(PrimaryContact primaryContact) {
this.primaryContact = primaryContact;
}

}
-----------------------------------com.example.Location.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Location {

@SerializedName("lon")
@Expose
private Double lon;
@SerializedName("lat")
@Expose
private Double lat;

public Double getLon() {
return lon;
}

public void setLon(Double lon) {
this.lon = lon;
}

public Double getLat() {
return lat;
}

public void setLat(Double lat) {
this.lat = lat;
}

}
-----------------------------------com.example.PrimaryContact.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class PrimaryContact {

@SerializedName("firstName")
@Expose
private String firstName;
@SerializedName("lastName")
@Expose
private String lastName;
@SerializedName("jobTitle")
@Expose
private String jobTitle;
@SerializedName("email")
@Expose
private String email;
@SerializedName("photo")
@Expose
private String photo;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getJobTitle() {
return jobTitle;
}

public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPhoto() {
return photo;
}

public void setPhoto(String photo) {
this.photo = photo;
}

}
1 голос
/ 03 апреля 2019

Вы также должны создать свой primaryContact объект и сериализовать его таким же образом с @Expose и @SerializedName("whatever"). Затем добавьте primaryContact к тому классу, который у вас есть, и сериализуйте его с правильным именем.

Это в основном то же, что и вложенный json. Таким образом, вместо вложенного JSON вы создаете вложенные объекты.

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