Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON/GSON,可将密钥转换为Java_Java_Json_Gson - Fatal编程技术网

JSON/GSON,可将密钥转换为Java

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

我试图使用一些bean和GSON将一些JSON处理成一个Java对象。然而,我使用的JSON代码中的键可以根据最近交易的内容随时间而改变。我可以手动创建一个包含每个货币代码的bean文件,但最终,它们都可能不同,我的程序也会崩溃

这是我的密码:

从我的主课:

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时,出现了一个存根错误。有人告诉我这是因为我在使用模拟器,实际上需要一个我没有的设备。