【问题标题】:Java Convert multiple arraylists to 1 JSONJava 将多个数组列表转换为 1 个 JSON
【发布时间】:2021-01-30 12:16:50
【问题描述】:

我有一个问题。我有一个ArrayList,其对象名为:Candlestick。 Candlestick 类如下所示:

public class Candlestick {

    private long MainKey;
    private String Market;
    private String Coin;
    private String Period;
    private double Open;
    private double High;
    private double Low;
    private double Close;

    public String getMarket() {
        return Market;
    }

    public String getCoin() {
        return Coin;
    }

    public String getPeriod() {
        return Period;
    }
}

现在我想创建如下所示的 JSON:

{
   "USDT":{
      "BTC":{
         "5m":[
            {
               "MainKey":1,
               "Open":3000,
               "Close":3100,
               "High":3100,
               "Low":2900
            },
            {
               "MainKey":2,
               "Open":3000,
               "Close":3100,
               "High":3100,
               "Low":2900
            }
         ],
         "1h":[
            {
               "MainKey":1,
               "Open":3000,
               "Close":3100,
               "High":3100,
               "Low":2900
            },
            {
               "MainKey":2,
               "Open":3000,
               "Close":3100,
               "High":3100,
               "Low":2900
            }
         ],
         "3h":[
            {
               "MainKey":1,
               "Open":3000,
               "Close":3100,
               "High":3100,
               "Low":2900
            },
            {
               "MainKey":2,
               "Open":3000,
               "Close":3100,
               "High":3100,
               "Low":2900
            }
         ]
      }
   }
}

为此,我在 Java 中执行了以下操作:

Map<String, Map<String, Map<String, ArrayList<Candlestick>>>> candles = new HashMap<>();

for (Candlestick candlestick : simCandlestickList) {
    ArrayList<Candlestick> validCandlesticks = new ArrayList<>();
    System.out.println("Market: " + candlestick.getMarket());
    System.out.println("Coin: " + candlestick.getCoin());
    System.out.println("Period: " + candlestick.getPeriod());
    candles.put(candlestick.getMarket(), Map.of(candlestick.getCoin(), Map.of(candlestick.getPeriod(), simCandlestickList)));
}

这几乎给了我想要的结果,除了 1 件事... simCandlestickList 中的对象没有按应有的方式打印:

{
   "USDT":{
      "BTC":{
         "1m":[
            com.company.Candlestick@942a29c,
            com.company.Candlestick@1ed6388a,
            com.company.Candlestick@5a45133e,
            com.company.Candlestick@534a5a98,
            com.company.Candlestick@4f80542f
         ]
      }
   }
}

现在如何打印数组中烛台的每个属性?硬币、市场和时期是否再次出现都没关系!

【问题讨论】:

    标签: java json arraylist


    【解决方案1】:

    为此,您要么需要重写 Candlestick 类的 toString() 方法,要么使用 Jackson Databind 之类的库将数据序列化为 json。使用 Jackson 的 ObjectMapper,您的代码将如下所示:

    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Map<String, Map<String, List<Candlestick>>>> candles = new HashMap<>();
    for (Candlestick candlestick : simCandlestickList) {
        ArrayList<Candlestick> validCandlesticks = new ArrayList<>();
        System.out.println("Market: " + candlestick.getMarket());
        System.out.println("Coin: " + candlestick.getCoin());
        System.out.println("Period: " + candlestick.getPeriod());
        candles.put(candlestick.getMarket(), Map.of(candlestick.getCoin(), Map.of(candlestick.getPeriod(), jsonList)));
    }
    System.out.println(objectMapper.writer().writeValueAsString(candles));

    EDIT1:将蜡烛图更改为使用 List 而不是 ArrayList
    EDIT2:使用 ObjectMapper 打印整个地图,而不是将 Candlestick 数组写入字符串

    【讨论】:

    • no instance(s) of type variable(s) exist so that List&lt;String&gt; conforms to ArrayList&lt;String&gt; inference variable V has incompatible bounds: equality constraints: ArrayList&lt;String&gt; lower bounds: List&lt;String&gt;???
    • 在 Map 中使用 List 而不是 ArrayList - 使用接口而不是具体实现是一个好习惯
    • 我的 JSON 中有很多破折号,这是一个问题还是我可以这样吗?这是 JSON 的一部分:"coin\\\":\\\"BTC\\\",\\\"market\\\":\\\"USDT\\\",\\\"close\\\":3685.91,
    • JSONObject json = new JSONObject(candles); System.out.printf( "JSON: %s", json.toJSONString());
    • 我编辑了sn-p代码,应该可以了。简而言之,我没有尝试对烛台使用 List,而是使用 ObjectMapper 打印整个地图。您正在使用 JsonObject,这就是您得到的输出被转义的原因。
    【解决方案2】:

    一种方法是使用 gson 或 Jackson lib 将您的 java 对象转换为 JSON,从而将您的所有类成员放入键值对中。

    否则,您可以只使用 Map 并使用每个 Java 对象的每个类属性和值手动填充该映射。

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2020-08-08
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多