Проблема, чтобы превращать JSON в объект JAVA

У меня есть следующий JSON, это ответ одного API:

    {  
   "ES1800496542831234567890":{ "transactions":[  
         {  
            "idmovimiento":"714597",
            "fechaoperacion":"2016-05-27",
            "fechavalor":"2016-05-27",
            "descripcion":"descripcion 2",
            "importe":"-1431.43",
            "saldo":"0.00",
            "orden":"2",
            "oficinaorigen":"0901",
            "conceptocomun":"03",
            "conceptopropio":"227",
            "documento":"0000000000",
            "referencia1":"B50574300000",
            "referencia2":"2222222222222222",
            "newreferencia1":"",
            "newreferencia2":"",
            "facturas":"0",
            "documentos":"0",
            "additional":[  
               {  
                  "numcomplementario":"1",
                  "concepto1":"COR1Schindler Espana S.A. ",
                  "concepto2":" "
               },
               {  
                  "numcomplementario":"2",
                  "concepto1":"ES17501A50001726 000",
                  "concepto2":"000007275 "
               },
               {  
                  "numcomplementario":"3",
                  "concepto1":"OTHR Mas detalles de su factura en ",
                  "concepto2":"www.schindler.es FACTURA 3472855286 N"
               },
               {  
                  "numcomplementario":"4",
                  "concepto1":"IF-CIF ESE50110303 RECIBO 48317499\/2",
                  "concepto2":"314048 VTO 28-05-16 "
               },
               {  
                  "numcomplementario":"5",
                  "concepto1":"190000483174992016 0002314048 5 ",
                  "concepto2":" 20150415false "
               }
            ]
         },
         {  
            "idmovimiento":"714596",
            "fechaoperacion":"2016-05-27",
            "fechavalor":"2016-05-27",
            "descripcion":"descripcion editada",
            "importe":"-1431.43",
            "saldo":"1.00",
            "orden":"1",
            "oficinaorigen":"0901",
            "conceptocomun":"03",
            "conceptopropio":"227",
            "documento":"0000000000",
            "referencia1":"B50574300000",
            "referencia2":"E50110303 ",
            "newreferencia1":"111111111111",
            "newreferencia2":"222222222222222",
            "facturas":"1",
            "documentos":"0"
         }
      ]
   }
}

Я создал следующие Классы JAVA:

    public class Respuesta {

    private String error;
    private List<Cuenta> cuentas;

    public List<Cuenta> getCuentas() {
        return cuentas;
    }

    public void setCuentas(List<Cuenta> cuentas) {
        this.cuentas = cuentas;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}

    public class Cuenta {

    private String iban;
    private Transactions transactions;

    public String getIban() {
        return iban;
    }

    public void setIban(String iban) {
        this.iban = iban;
    }

    public Transactions getTransactions() {
        return transactions;
    }

    public void setTransactions(Transactions transactions) {
        this.transactions = transactions;
    }
}

    public class Transactions {

    private List<Movimientos> movimientos;

    public List<Movimientos> getMovimientos() {
        return movimientos;
    }

    public void setMovimientos(List<Movimientos> movimientos) {
        this.movimientos = movimientos;
    }
}

    public class Movimientos {

    private Long idmovimiento;
    private Date fechaoperacion;
    private Date fechavalor;
    private String descripcion;
    private BigDecimal importe;
    private BigDecimal saldo;
    private Integer orden;
    private String oficinaorigen;
    private String conceptocomun;
    private String conceptoPropio;
    private String documento;
    private String referencia1;
    private String referencia2;
    private String newreferencia1;
    private String newreferencia2;
    private int facturas;
    private int documentos;
    private List<Additional> additional;

    public String getConceptoPropio() {
        return conceptoPropio;
    }

    public void setConceptoPropio(String conceptoPropio) {
        this.conceptoPropio = conceptoPropio;
    }

    public Long getIdmovimiento() {
        return idmovimiento;
    }

    public void setIdmovimiento(Long idmovimiento) {
        this.idmovimiento = idmovimiento;
    }

    public Date getFechaoperacion() {
        return fechaoperacion;
    }

    public void setFechaoperacion(Date fechaoperacion) {
        this.fechaoperacion = fechaoperacion;
    }

    public Date getFechavalor() {
        return fechavalor;
    }

    public void setFechavalor(Date fechavalor) {
        this.fechavalor = fechavalor;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public BigDecimal getImporte() {
        return importe;
    }

    public void setImporte(BigDecimal importe) {
        this.importe = importe;
    }

    public BigDecimal getSaldo() {
        return saldo;
    }

    public void setSaldo(BigDecimal saldo) {
        this.saldo = saldo;
    }

    public Integer getOrden() {
        return orden;
    }

    public void setOrden(Integer orden) {
        this.orden = orden;
    }

    public String getOficinaorigen() {
        return oficinaorigen;
    }

    public void setOficinaorigen(String oficinaorigen) {
        this.oficinaorigen = oficinaorigen;
    }

    public String getConceptocomun() {
        return conceptocomun;
    }

    public void setConceptocomun(String conceptocomun) {
        this.conceptocomun = conceptocomun;
    }

    public String getDocumento() {
        return documento;
    }

    public void setDocumento(String documento) {
        this.documento = documento;
    }

    public String getReferencia1() {
        return referencia1;
    }

    public void setReferencia1(String referencia1) {
        this.referencia1 = referencia1;
    }

    public String getReferencia2() {
        return referencia2;
    }

    public void setReferencia2(String referencia2) {
        this.referencia2 = referencia2;
    }

    public String getNewreferencia1() {
        return newreferencia1;
    }

    public void setNewreferencia1(String newreferencia1) {
        this.newreferencia1 = newreferencia1;
    }

    public String getNewreferencia2() {
        return newreferencia2;
    }

    public void setNewreferencia2(String newreferencia2) {
        this.newreferencia2 = newreferencia2;
    }

    public int getFacturas() {
        return facturas;
    }

    public void setFacturas(int facturas) {
        this.facturas = facturas;
    }

    public int getDocumentos() {
        return documentos;
    }

    public void setDocumentos(int documentos) {
        this.documentos = documentos;
    }

    public List<Additional> getAdditional() {
        return additional;
    }

    public void setAdditional(List<Additional> additional) {
        this.additional = additional;
    }
}

    public class Additional {

    private String numComplementario;
    private String concepto1;
    private String concepto2;

    public String getNumComplementario() {
        return numComplementario;
    }

    public void setNumComplementario(String numComplementario) {
        this.numComplementario = numComplementario;
    }

    public String getConcepto1() {
        return concepto1;
    }

    public void setConcepto1(String concepto1) {
        this.concepto1 = concepto1;
    }

    public String getConcepto2() {
        return concepto2;
    }

    public void setConcepto2(String concepto2) {
        this.concepto2 = concepto2;
    }
}

Но когда я пробую обращать JSON в объект JAVA признаки пустые. Не является правильной структура JAVA что я собрал? Каковой была бы правильная?

2
задан 10.10.2016, 22:51
7 ответов

Проблема, которая tenГ©s состоит в том, что для того, чтобы gson он сделал Вашу "Магию", у всех переменных должно быть Ваше довольно определенное имя.

твоя проблема - что число счета, что ты queres извлекать, приходит Json как будто это было имя Поля.

я бы это решил следующего способа:

Сначала добавлять эти зависимости:

<dependency>
       <groupId>org.json</groupId>
       <artifactId>json</artifactId>
       <version> LATEST</version>
</dependency>
<dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
       <version>2.7</version>
</dependency>

классы, которые ты создал, оставил бы равно (Только что класс "Ответ" не она usГ©).

И во время конвертирования Json делать это:

import org.json.JSONObject;
import com.google.gson.Gson;



    JSONObject obj = new JSONObject(jsonData);
    Set<String> st = obj.keySet();
    Cuenta cuenta = new Cuenta();
    cuenta.setIban(st.toArray()[0].toString());
    Gson gson = new Gson();
    Movimientos[] movs = gson.fromJson(obj.getJSONObject(st.toArray()[0].toString()).getJSONArray("transactions").toString(),Movimientos[].class);
    Transactions transactions = new Transactions();
    transactions.setMovimientos(new ArrayList<Movimientos>(Arrays.asList(movs)));
    cuenta.setTransactions(transactions);
    System.out.println(cuenta.toString());

jsonData - String со всем ответ.

С этим ты создаешь счет с IBAN и Сделками.

надеялся, что он подает тебя! saludos. -

0
ответ дан 24.11.2019, 13:09
  • 1
    Так как в конце концов я это решил, как ты показал. Это и #250; nico, который я был должен изменять c и # 243; я говорю, что ты поместил, потому что, если у счета нет движений, стоимость для счета - другой array с json. Так или иначе мне не кажется правильным ответ API. – Enrique Rodrigo Alejandro 14.10.2016, 20:55

cГіdigo, чтобы реализовывать ее conversiГіn, он этот:

AgrFinanciero mvtos = gson.fromJson(jsonMovimientos, AgrFinanciero.class);

Переменная jsonMovimientos содержит ответ полученная в вызове.

1
ответ дан 24.11.2019, 13:09

cГіdigo:

AgrFinanciero mvtos = gson.fromJson(jsonMovimientos, AgrFinanciero.class);

правилен, однако, остается упоминать о том, что ты должен включать ссылку gSon на твой проект java. ВїYa ты это сделал?

0
ответ дан 24.11.2019, 13:09

Для того, чтобы GSON сумел превращать JSON в объект, будь должен знать, какая корреспонденция есть между стоимостью и признаками объектов.

Обычно имя поля облегчает это ему, а именно с

{"nombre":"Jhon Wayne"}

GSON (или Джексон) умеют делать

setNombre("Jhon Wayne")

такие нормальные признаки как стоимость, arrays как списки, и т.д. это сделают автоматически, если имя свойства в твоем bean будет соответствовать тому, у которого есть JSON

Но ох Боже мой

У JSON, который они перемещают тебя, есть признак ES1800496542831234567890, что безопасный, что изменчивый (правильное состояло бы в том, чтобы они это определили, как "пойдите": "ES1800496542831234567890" и потом "восходи": {.... оставшаяся часть.... }

ergo, будет касаться тебя currarte serializador в руку, так как GSON это не будет уметь конвертировать единственного

Ты можешь пытаться использовать карту "в волосы" вместо объекта дела, это жестянка, но оно будет функционировать

Map<String,Object> result = gson.fromJson(jsonMovimientos,HashMap.class);
0
ответ дан 24.11.2019, 13:09
  • 1
    Мне не кажется правильным добавлять его " ES1800496542831234567890" поскольку Пойдите, ввиду того, что circuntancias могут быть много, например, если этот Json - ответ услуги поставщика или третьих, не всегда имеется возможность, чтобы изменять услуги в нашу целесообразность. В этом случае, ES1800496542831234567890 - имя объекта и est и # 225; форма имеет по отношению к себе, что deserializar. – Phi 12.10.2016, 23:58
  • 2
    Я не сказал добавлять это, сказал, что JSON est и # 225; плохо скажи себе и # 241; ado, очевидно м и # 225; s страховка состоит в том, чтобы ты был должен по отношению к себе глотать это. Но если бы я было, скажи себе и # 241; ado этот JSON хорошо: RFC = > " An object structure is represented схвати в pair of curly brackets surrounding zero or обитайте ямс / оцените pairs (or members). В ямс is в string. В single ободочная кишка ты ешь after each ямс, separating the ямс from the оцените. и quot; est и # 225; используя стоимость как имя, с моей точки зрения – earroyoron 13.10.2016, 17:00
  • 3
    Скажи себе и # 241; или также он мне не кажется, что est и # 233; плохо, и дело не в том, что стоимость, что est и # 233; используя как имя, эксперт и # 237; est и # 225; определенный, и поскольку я не вижу структуру Json ning и # 250; n проблема. Если мы делаем analog и # 237; в в c и # 243; я говорю, имя объекта " ES1800496542831234567890" соответствуй списку объектов типа " transactions". – Phi 13.10.2016, 17:37

Ты можешь использовать эту страницу http://www.jsonschema2pojo.org/ чтобы создавать твои модели.

В твоем случае оно было бы следующим:

public class Additional {

    @SerializedName("numcomplementario")
    @Expose
    public String numcomplementario;
    @SerializedName("concepto1")
    @Expose
    public String concepto1;
    @SerializedName("concepto2")
    @Expose
    public String concepto2;

}

public class ES1800496542831234567890 {

    @SerializedName("transactions")
    @Expose
    public List<Transaction> transactions = new ArrayList<Transaction>();

}

public class Example {

    @SerializedName("ES1800496542831234567890")
    @Expose
    public ES1800496542831234567890 eS1800496542831234567890;

}

public class Transaction {

    @SerializedName("idmovimiento")
    @Expose
    public String idmovimiento;
    @SerializedName("fechaoperacion")
    @Expose
    public String fechaoperacion;
    @SerializedName("fechavalor")
    @Expose
    public String fechavalor;
    @SerializedName("descripcion")
    @Expose
    public String descripcion;
    @SerializedName("importe")
    @Expose
    public String importe;
    @SerializedName("saldo")
    @Expose
    public String saldo;
    @SerializedName("orden")
    @Expose
    public String orden;
    @SerializedName("oficinaorigen")
    @Expose
    public String oficinaorigen;
    @SerializedName("conceptocomun")
    @Expose
    public String conceptocomun;
    @SerializedName("conceptopropio")
    @Expose
    public String conceptopropio;
    @SerializedName("documento")
    @Expose
    public String documento;
    @SerializedName("referencia1")
    @Expose
    public String referencia1;
    @SerializedName("referencia2")
    @Expose
    public String referencia2;
    @SerializedName("newreferencia1")
    @Expose
    public String newreferencia1;
    @SerializedName("newreferencia2")
    @Expose
    public String newreferencia2;
    @SerializedName("facturas")
    @Expose
    public String facturas;
    @SerializedName("documentos")
    @Expose
    public String documentos;
    @SerializedName("additional")
    @Expose
    public List<Additional> additional = new ArrayList<Additional>();

}
0
ответ дан 24.11.2019, 13:09
  • 1
    brother, желанный в сайт! я рекомендую тебе делать примеры, основанные на унифицированном указателе ресурса, о котором ты упоминаешь, чтобы давать ему большее качество твоему ответу. Привет! – fredyfx 12.10.2016, 22:34
  • 2
    @fredyfx спасибо, уже я обновил ответ – Javi Chaqués 13.10.2016, 11:07

Я использую Джексон:

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

Для сложных объектов ты будешь должен использовать что-то похожее на это:

ObjectMapper mapper = new ObjectMapper();
Respuesta miRespuesta = mapper.readValue(json, new TypeReference<Respuesta() {
});

Если я схватил, оно ты не функционировало у тебя было бы, что deserializar объект List независимой формы:

List<Cuenta> miRespuesta = mapper.readValue(json, new TypeReference<List<Cuenta>>() {
    });
0
ответ дан 24.11.2019, 13:09

Не deserializa объект, потому что структура плохая определенная. Ты должен считать что-то похожим в:

public class objetoCompleto {
    public List<transaction> objTransaction;
}

public class additional {
    private String numComplementario;
    private String concepto1;
    private String concepto2;
}

public class transaction {
    private Long idmovimiento;
    private Date fechaoperacion;
    private Date fechavalor;
    private String descripcion;
    private BigDecimal importe;
    private BigDecimal saldo;
    private Integer orden;
    private String oficinaorigen;
    private String conceptocomun;
    private String conceptoPropio;
    private String documento;
    private String referencia1;
    private String referencia2;
    private String newreferencia1;
    private String newreferencia2;
    private int facturas;
    private int documentos;
    private List<Additional> additional;
}
0
ответ дан 24.11.2019, 13:09