gson 用java实现数组解析Json数据

a6b3iqyw  于 2022-11-06  发布在  Java
关注(0)|答案(3)|浏览(173)

我使用gson来获取parese json数据。但我有一些问题这里是我的json url数据https://api.kcg.gov.tw/api/service/get/2c1d9959-d038-4918-bae3-409680f8193a
您可以看到json数据具有结构。
首先是我代码

package iii_project;

import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.Arrays;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.annotations.SerializedName;

import java.util.List;

public class GsonFetchNetworkJson2 {
    public class ItemType {
        int seq;
        String 資料年度;
        String 統計項目;
        String 稅目別;
        String 資料單位;
        String 值;
//      public String toString() { 
//          return Arrays.toString(seq);
//      }
    }
    public class Item {
        String isImage;
        String success;
        String id;
        ItemType[] data;
        @Override
        public String toString() {
            return "Item [isImage=" + isImage + ", success=" + success + ", data=" + Arrays.toString(data) + "]";
        }

    }

    public static void main(String[] ignored) throws Exception {
//    Type listType = new TypeToken<List<Item>>() {}.getType();
       URL url = new URL("https://api.kcg.gov.tw/api/service/get/2c1d9959-d038-4918-bae3-409680f8193a");
       InputStreamReader reader = new InputStreamReader(url.openStream());
       Item dto = new Gson().fromJson(reader, Item.class);
       System.out.println(dto);
//       System.out.println(dto.isImage);
//       System.out.println(dto.id);
//       System.out.println(dto.success);

//       System.out.println(dto.types);
//       System.out.println(dto.data.toString());
//       System.out.println(dto.toString());
//       System.out.println(Arrays.toString(dto.date));
//      Detail abd = new Gson().fromJson(reader, Detail.class);
//      System.out.println(Arrays.toString(abd.值));
//      System.out.println(abd.資料單位);
//      System.out.println(Arrays.toString(dto.data));
    }
}

但结果

System.out.println(dto);

我已经覆盖它,但仍然无法工作x1c 0d1x
我需要这样的数据:

这就是答案!!!

package iii_project;

import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.Arrays;
import java.util.Map;
import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.annotations.SerializedName;

import java.util.List;

public class GsonFetchNetworkJson2 {
    public class ItemType {
        private int seq;
        private String 資料年度;
        private String 統計項目;
        private String 稅目別;
        private String 資料單位;
        private String 值;
        //getter and setter
        @Override
        public String toString() {
            return "ItemType [seq=" + seq + ", 資料年度=" + 資料年度 + ", 統計項目=" + 統計項目 + ", 稅目別=" + 稅目別 + ", 資料單位=" + 資料單位
                    + ", 值=" + 值 + "]";
        }

    }
    public class Item {
        String isImage;
        String success;
        String id;
        ItemType[] data;
        @Override
        public String toString() {
            return "Item [isImage=" + isImage + ", success=" + success + ", id=" + id + ", data="
                    + Arrays.toString(data) + "]";
        }

    }

    public static void main(String[] ignored) throws Exception {
//    Type listType = new TypeToken<List<Item>>() {}.getType();
       URL url = new URL("https://api.kcg.gov.tw/api/service/get/2c1d9959-d038-4918-bae3-409680f8193a");
       InputStreamReader reader = new InputStreamReader(url.openStream());
       Item dto = new Gson().fromJson(reader, Item.class);
//     System.out.println(dto);
//       System.out.println(Arrays.toString(dto.data));
       System.out.println(dto.isImage);
       System.out.println(dto);
//       for(ItemType element : dto.data) {
//           System.out.println(element);
//       }
//       System.out.println(dto.data);
//       System.out.println(dto.id);
//       System.out.println(dto.success);

//       System.out.println(dto.types);
//       System.out.println(dto.data.toString());
//       System.out.println(dto.toString());
//       System.out.println(Arrays.toString(dto.date));
//      Detail abd = new Gson().fromJson(reader, Detail.class);
//      System.out.println(Arrays.toString(abd.值));
//      System.out.println(abd.資料單位);
//      System.out.println(Arrays.toString(dto.data));
    }
}
qnyhuwrf

qnyhuwrf1#

您的dto.data是数组,因此您的当前输出是该数组的地址。
请查看以下内容以了解更多详细信息:What's the simplest way to print a Java array?

smtd7mpg

smtd7mpg2#

您需要覆盖Detail类中的toString函数,否则它只会打印出对象的地址。

w41d8nur

w41d8nur3#

但仍然不能工作
它的工作原理与您编写的完全一样!
我想要这样的数据(* 显示一些JSON对象的图像 *)
您需要在toString函数中 * 显式写入缩进 *,然后
比如说

public String toString() {
    StringBuilder sb = new StringBuilder("{\n");
    sb.append("  \"isImage\":" + isImage).append(",\n");
    sb.append("  \"data\":");
    if (data.length == 0) {
       // add empty array string "[]"
    } else {
        sb.append("[");
        for (ItemType it : data) {
           // create object string 
          // append to outer builder 
          // add a comma, but not for the very last object in the array 
        }
        sb.append("]");
    }
    // TODO: close off remaining end brackets 
    return sb.toString();
}

而且ItemType类仍然需要它自己的toString...
如果您真的只想打印缩进的JSON而不需要太多代码,那么就不要尝试打印Item类
Pretty-Print JSON in Java

相关问题