JSON / GSON с заменой ключей на Java - PullRequest
1 голос
/ 11 июля 2011

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

Вот мой код:

Из моего основного класса:

public void updateData() {
    Data data;
    String s = null;
    try {
        s = DataGetter.getJSON("http://bitcoincharts.com/t/weighted_prices.json");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    s = s.replaceAll("7d", "week");
    s = s.replaceAll("30d", "month");
    s = s.replaceAll("24h", "day");
    s = s.toLowerCase();
    data = new Gson().fromJson(s, Data.class);
}

Data.java:

package tehsusenoh.bittick.get;

import java.util.ArrayList;
import java.util.List;

public class Data {

public enum Currency {
    USD, AUD, RUB, GAU, BGN, CNY, SLL, INR, GBP, PLN, SAR, EUR, CLP, CAD
}

private CurrencyData usd;
private CurrencyData aud;
private CurrencyData rub;
private CurrencyData gau;
private CurrencyData bgn;
private CurrencyData cny;
private CurrencyData sll;
private CurrencyData inr;
private CurrencyData gbp;
private CurrencyData pln;
private CurrencyData sar;
private CurrencyData eur;
private CurrencyData clp;
private CurrencyData cad;

public List<CurrencyData> getData() {
    List<CurrencyData> d = new ArrayList<CurrencyData> ();
    d.add(usd);
    d.add(aud);
    d.add(rub);
    d.add(gau);
    d.add(bgn);
    d.add(cny);
    d.add(sll);
    d.add(inr);
    d.add(gbp);
    d.add(pln);
    d.add(sar);
    d.add(eur);
    d.add(clp);
    d.add(cad);
    return d;
}

public CurrencyData get(Currency c) {
    switch (c) {
    case USD: {
        return usd;
    }
    case AUD: {
        return aud;
    }
    case RUB: {
        return rub;
    }
    case GAU: {
        return gau;
    }
    case BGN: {
        return bgn;
    }
    case CNY: {
        return sll;
    }
    case INR: {
        return inr;
    }
    case GBP: {
        return gbp;
    }
    case PLN: {
        return pln;
    }
    case SAR: {
        return sar;
    }
    case EUR: {
        return eur;
    }
    case CLP: {
        return clp;
    }
    case CAD: {
        return cad;
    }
    default: {
        return null;
    }
    }
}

public void addCodes() {
    usd.setCode("USD");
    aud.setCode("AUD");
    rub.setCode("RUB");
    gau.setCode("GAU");
    bgn.setCode("BGN");
    cny.setCode("CNY");
    sll.setCode("SLL");
    inr.setCode("INR");
    gbp.setCode("GBP");
    pln.setCode("PLN");
    sar.setCode("SAR");
    eur.setCode("EUR");
    clp.setCode("CLP");
    cad.setCode("CAD");

}

public String toString() {
    return "" + getData();
}
}

И, наконец, CurrencyData.java:

package tehsusenoh.bittick.get;

public class CurrencyData {

private Double week;
private Double month;
private Double day;
private String code;

public CurrencyData() {}

public Double getWeek() { return week; }
public Double getMonth() { return month; }
public Double getDay() { return day; }
public String getCode() { return code; }

public void setWeek(Double d) { week = d; }
public void setMonth(Double d) { month = d; }
public void setDay(Double d) { day = d; }
public void setCode(String aCode) { code = aCode; }

public String toString() {
    return code + ":: week:" + week + " month:" + month + " day:" + day;
}
}

1 Ответ

0 голосов
/ 11 июля 2011

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

СGson, вот как это решение выглядело бы.

import java.io.FileReader;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    Type currencyMapType = new TypeToken<Map<String, Currency>>() {}.getType();
    Map<String, Currency> currencyMap = gson.fromJson(new FileReader("input.json"), currencyMapType);
    System.out.println(currencyMap);
  }
}

class Currency
{
  @SerializedName("7d")
  BigDecimal _7d;
  @SerializedName("30d")
  BigDecimal _30d;
  @SerializedName("24h")
  BigDecimal _24h;

  @Override
  public String toString()
  {
    return String.format("{7d:%s, 30d:%s, 24h:%s}", _7d, _30d, _24h);
  }
}

Следующее обновление создает список валют из данных валют на десериализованной карте.

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