简体   繁体   English

使用 java 用数组解析 Json 数据

[英]parse Json data with array using java

i use gson to get parese json data.but i have some problems here is my json url data https://api.kcg.gov.tw/api/service/get/2c1d9959-d038-4918-bae3-409680f8193a i use gson to get parese json data.but i have some problems here is my json url data https://api.kcg.gov.tw/api/service/get/2c1d9959-d038-4918-bae3-409680f8193a

you can see that the json data have structure.您可以看到 json 数据具有结构。

here is my code first这是我的代码

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));
    }
}

but the result of但结果

System.out.println(dto);

i haved override it but still can not work我已经覆盖它但仍然无法工作在此处输入图像描述

i want the data like this:我想要这样的数据: 在此处输入图像描述

here is the answer!!!!这就是答案!!!!

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));
    }
}

Your dto.data is array, so your current output is the address of that array.您的 dto.data 是数组,因此您当前的 output 是该数组的地址。 Replace your System.out.println(dto.data) by System.out.println(Arrays.toString(array));System.out.println(dto.data)替换为System.out.println(Arrays.toString(array)); to print your data array打印您的数据数组

Check out this to have more details: What's the simplest way to print a Java array?查看此内容以了解更多详细信息: 打印 Java 数组的最简单方法是什么?

You need to override the toString function in your Detail class, otherwise it will only print out its address for the object.您需要覆盖您的详细信息 class 中的 toString function,否则它只会打印出 object 的地址。

but still can not work但仍然无法工作

It works exactly as you've written it to!它的工作原理与您编写的完全一样!

I want the data like this ( shows image of some JSON object )我想要这样的数据(显示一些 JSON object 的图像

You need to explicitly write the indentation in your toString function, then您需要在 toString function 中显式写入缩进,然后

For example例如

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();
} 

And your ItemType class still needs it's own toString...而且您的 ItemType class 仍然需要它自己的 toString ...

If you really just want to print indented JSON without much code, then don't try to print an Item class如果您真的只想打印缩进的 JSON 而没有太多代码,请不要尝试打印 Item class

Pretty-Print JSON in Java Java 中的漂亮打印 JSON

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM