JSON/GSON,可将密钥转换为Java
我试图使用一些bean和GSON将一些JSON处理成一个Java对象。然而,我使用的JSON代码中的键可以根据最近交易的内容随时间而改变。我可以手动创建一个包含每个货币代码的bean文件,但最终,它们都可能不同,我的程序也会崩溃 这是我的密码: 从我的主课:JSON/GSON,可将密钥转换为Java,java,json,gson,Java,Json,Gson,我试图使用一些bean和GSON将一些JSON处理成一个Java对象。然而,我使用的JSON代码中的键可以根据最近交易的内容随时间而改变。我可以手动创建一个包含每个货币代码的bean文件,但最终,它们都可能不同,我的程序也会崩溃 这是我的密码: 从我的主课: public void updateData() { Data data; String s = null; try { s = DataGetter.getJSON("http://bitcoinc
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();
}
}
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;
}
}
由于生成JSON的好人选择使用JSON对象来保存一组东西,而不是使用JSON数组,因此Jim建议使用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);
}
}
导入java.io.FileReader;
导入java.lang.reflect.Type;
导入java.math.BigDecimal;
导入java.util.Map;
导入com.google.gson.gson;
导入com.google.gson.annotations.SerializedName;
导入com.google.gson.reflect.TypeToken;
公开课Foo
{
公共静态void main(字符串[]args)引发异常
{
Gson Gson=新的Gson();
类型currencyMapType=newTypeToken(){}.getType();
Map currencyMap=gson.fromJson(新文件读取器(“input.json”),currencyMapType);
System.out.println(currencyMap);
}
}
类别货币
{
@序列化名称(“7d”)
大十进制7d;
@序列化名称(“30d”)
大十进制30d;
@序列化名称(“24小时”)
大十进制(24小时),;
@凌驾
公共字符串toString()
{
返回String.format(“{7d:%s,30d:%s,24h:%s}”,_7d,_30d,_24h);
}
}
以下更新从反序列化映射中的货币数据生成货币列表
import java.io.FileReader;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
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 currencyDataMapType = new TypeToken<Map<String, CurrencyData>>() {}.getType();
Map<String, CurrencyData> currencyDataMap = gson.fromJson(new FileReader("input.json"), currencyDataMapType);
List<Currency> currencies = fromDataMap(currencyDataMap);
System.out.println(currencies);
}
static List<Currency> fromDataMap(Map<String, CurrencyData> currencyDataMap)
{
List<Currency> currencies = new ArrayList<Currency>(currencyDataMap.size());
for (Entry<String, CurrencyData> entry : currencyDataMap.entrySet())
{
String code = entry.getKey();
currencies.add(new Currency(code, currencyDataMap.get(code)));
}
return currencies;
}
}
class Currency
{
String code;
CurrencyData data;
Currency(String code, CurrencyData data)
{
this.code = code;
this.data = data;
}
@Override
public String toString()
{
return String.format("{code:%s, 7d:%s, 30d:%s, 24h:%s}", code, data._7d, data._30d, data._24h);
}
}
class CurrencyData
{
@SerializedName("7d")
BigDecimal _7d;
@SerializedName("30d")
BigDecimal _30d;
@SerializedName("24h")
BigDecimal _24h;
}
导入java.io.FileReader;
导入java.lang.reflect.Type;
导入java.math.BigDecimal;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入com.google.gson.gson;
导入com.google.gson.annotations.SerializedName;
导入com.google.gson.reflect.TypeToken;
公开课Foo
{
公共静态void main(字符串[]args)引发异常
{
Gson Gson=新的Gson();
类型currencyDataMapType=newTypeToken(){}.getType();
Map currencyDataMap=gson.fromJson(新文件读取器(“input.json”),currencyDataMapType);
列表货币=fromDataMap(currencyDataMap);
系统输出打印项次(货币);
}
来自DataMap的静态列表(Map currencyDataMap)
{
列表货币=新的ArrayList(currencyDataMap.size());
for(条目:currencyDataMap.entrySet())
{
字符串代码=entry.getKey();
添加(新货币(代码,currencyDataMap.get(代码));
}
返回货币;
}
}
类别货币
{
字符串代码;
货币数据;
货币(字符串代码、货币数据)
{
this.code=代码;
这个数据=数据;
}
@凌驾
公共字符串toString()
{
返回字符串.format(“{code:%s,7d:%s,30d:%s,24h:%s}”,代码,数据。_7d,数据。_30d,数据。_24h);
}
}
类货币数据
{
@序列化名称(“7d”)
大十进制7d;
@序列化名称(“30d”)
大十进制30d;
@序列化名称(“24小时”)
大十进制(24小时),;
}
您最好使用字符串货币名称和java.util.HashMap。这使您的代码独立于实际的货币名称集。我曾试图做类似的事情,但无法使其工作。在你发布这篇文章之前,我找到了一份工作。这要好得多,但是有没有办法在对象中包含像USD这样的货币代码?一旦数据在地图上,你如何访问它?我以前从未使用过地图。“一旦数据在地图中,你如何访问它?我以前从未使用过地图。”——我建议先学习基础知识。有很多在线资源可以学习如何使用Java编程。“有没有办法在对象中包含美元这样的货币代码?”--有,但需要自定义反序列化处理,这并不太复杂,但由于JSON结构不适合目标Java数据结构,在执行上面演示的简单反序列化步骤之后,只需将Java对象转换为所需的对象就容易多了。我将发布这样做的示例代码,其中包括从地图中获取数据。我参加了学校的AP Comp Sci课程,但我们只学会了参加AP测试的最低要求。我对Java很了解,但只使用了ArrayList等。我的android应用程序已经相当完整了,除了当我试图从互联网上下载json时,出现了一个存根错误。有人告诉我这是因为我在使用模拟器,实际上需要一个我没有的设备。