简体   繁体   中英

Retrofit2: Display Json Object in an Array

I am trying to display the information of the following JSON.

{
"resourceType": "Patient",
"text": {
  "status": "generated",
  "div": "<div>\n      \n      <table>\n        \n        <tbody>\n          \n          <tr>\n            \n            <td>Name</td>\n            \n            <td>Peter James \n              <b>Chalmers</b> (&quot;Jim&quot;)\n            </td>\n          \n          </tr>\n          \n          <tr>\n            \n            <td>Address</td>\n            \n            <td>534 Erewhon, Pleasantville, Vic, 3999</td>\n          \n          </tr>\n          \n          <tr>\n            \n            <td>Contacts</td>\n            \n            <td>Home: unknown. Work: (03) 5555 6473</td>\n          \n          </tr>\n          \n          <tr>\n            \n            <td>Id</td>\n            \n            <td>MRN: 12345 (Acme Healthcare)</td>\n          \n          </tr>\n        \n        </tbody>\n      \n      </table>    \n    \n    </div>"
},
"identifier": [
  {
    "fhir_comments": [
      "   MRN assigned by ACME healthcare on 6-May 2001   "
    ],
    "use": "usual",
    "type": {
      "coding": [
        {
          "system": "http://hl7.org/fhir/v2/0203",
          "code": "MR"
        }
      ]
    },
    "system": "urn:oid:1.2.36.146.595.217.0.1",
    "value": "12345",
    "period": {
      "start": "2001-05-06"
    },
    "assigner": {
      "display": "Acme Healthcare"
    }
  }
],
"active": true,
"name": [
  {
    "fhir_comments": [
      "   Peter James Chalmers, but called \"Jim\"   "
    ],
    "use": "official",
    "family": [
      "Chalmers"
    ],
    "given": [
      "Peter",
      "James"
    ]
  },
  {
    "use": "usual",
    "given": [
      "Jim"
    ]
  }
],
"telecom": [
  {
    "fhir_comments": [
      "   home communication details aren't known   "
    ],
    "use": "home"
  },
  {
    "system": "phone",
    "value": "(03) 5555 6473",
    "use": "work"
  }
],
"gender": "male",
"_genderInfo": {
  "fhir_comments": [
    "   use FHIR code system for male / female   "
  ]
},
"birthDate": "1974-12-25",
"_birthDateInfo": {
  "extension": [
    {
      "url": "http://hl7.org/fhir/StructureDefinition/patient-birthTime",
      "valueDateTime": "1974-12-25T14:35:45-05:00"
    }
  ]
},
"deceasedBoolean": false,
"address": [
  {
    "use": "home",
    "type": "both",
    "line": [
      "534 Erewhon St"
    ],
    "city": "PleasantVille",
    "district": "Rainbow",
    "state": "Vic",
    "postalCode": "3999",
    "period": {
      "start": "1974-12-25"
    }
  }
],
"contact": [
  {
    "relationship": [
      {
        "coding": [
          {
            "system": "http://hl7.org/fhir/patient-contact-relationship",
            "code": "partner"
          }
        ]
      }
    ],
    "name": {
      "family": [
        "du",
        "Marché"
      ],
      "_familyInfo": [
       {
          "extension": [
            {
              "fhir_comments": [
                "   the \"du\" part is a family name prefix (VV in iso 21090)   "
              ],
              "url": "http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier",
              "valueCode": "VV"
            }
          ]
        },
        null
      ],
      "given": [
        "Bénédicte"
      ]
    },
    "telecom": [
      {
        "system": "phone",
        "value": "+33 (237) 998327"
      }
    ],
    "gender": "female",
    "period": {
      "start": "2012",
      "_startInfo": {
        "fhir_comments": [
          "   The contact relationship started in 2012   "
        ]
      }
    }
  }
]
}

My class for the @GET

public interface RetrofitObjectAPI {
  @GET("Patient/4765?_format=json")
  Call<Patient> getPatientDetails();
}

I created the MOJO with http://www.jsonschema2pojo.org/ (Getter and Setter are shortened only to display the important)

public class Patient {

private String resourceType;
private int id;
private Text text;
private List<Identifier> identifier = null;
private boolean active;
private List<Name> name = null;
private List<Telecom> telecom = null;
private String gender;
private GenderInfo genderInfo;
private String birthDate;
private BirthDateInfo birthDateInfo;
private boolean deceasedBoolean;
private List<Address> address = null;
private List<Contact> contact = null;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

public List<Name> getName() {
    return name;
}

public void setName(List<Name> name) {
    this.name = name;
}

The class of Name looks like this

public class Name {

private List<String> fhirComments = null;
private String use;
private List<String> family = null;
private List<String> given = null;
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

  public List<String> getFhirComments() {
      return fhirComments;
  }

  public void setFhirComments(List<String> fhirComments) {
      this.fhirComments = fhirComments;
  }

  public String getUse() {
      return use;
  }

  public void setUse(String use) {
      this.use = use;
  }

  public List<String> getFamily() {
      return family;
  }

  public void setFamily(List<String> family) {
      this.family = family;
  }

  public List<String> getGiven() {
      return given;
  }

  public void setGiven(List<String> given) {
      this.given = given;
  }

  public Map<String, Object> getAdditionalProperties() {
      return this.additionalProperties;
  }

  public void setAdditionalProperty(String name, Object value) {
      this.additionalProperties.put(name, value);
  }

}

I can get information without an array like this:

 public void getRetrofitObject() {

    Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
            .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    RetrofitObjectAPI service = retrofit.create(RetrofitObjectAPI.class);

    Call<Patient> callPatient = service.getPatientDetails();
    callPatient.enqueue(new Callback<Patient>() {
        @Override
        public void onResponse(Call<Patient> call, Response<Patient> response) {

            text_id_1.setText("Resource Type: " + response.body().getResourceType());
            text_id_2.setText("ID: " + response.body().getId());
            text_id_3.setText("Text: " + response.body().getText().getStatus());
        }

        @Override
        public void onFailure(Call<Patient> call, Throwable t) {
            Log.d("x", "x");
        }
    });

}

This code until this point works how it is supposed to. But I could not figure out how to display they array items. For example I want to display the filed "use" or "given" in "name". How can I access them?

Try adding this inside your onResponse call.

Patient patient = response.body();

List<Name> names = patient.getName();

for (Name name : names) {
    System.out.println(name.getGiven());
    System.out.println(name.getFamily());
    System.out.println(name.getUse());
}

You have all the information in your Patient object, you just need to look it up with the getters and setters you have.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM