java - 修改两个不同函数的 JSON 输出

标签 java json gson

我有两个函数,每个函数都接受一个数组列表描述符。我正在尝试为每个相应的函数打印不同的 JSON 输出。我正在使用 Gson 库来帮助我完成这项任务。我使用客户端数据模型对象来帮助正确格式化 JSON。下面附上为此目的的 getter 和 setter。

import java.util.ArrayList;
import java.util.List;

import com.google.gson.annotations.SerializedName;


public class ClientData {

    @SerializedName("TrialCountryCodes")
    private List<String> trialCountryCodes;

    @SerializedName("CancerGenePanel")
    private String cancerGenePanel;

    public ClientData() {
        this.trialCountryCodes = new ArrayList<String>();
    }

    public List<String> getTrialCountryCodes() {
        return trialCountryCodes;
    }

    public void setTrialCountryCodes(List<String> trialCountryCodes) {
        this.trialCountryCodes = trialCountryCodes;
    }

    public String getCancerGenePanel() {
        return cancerGenePanel;
    }

    public void setCancerGenePanel(String cancerGenePanel) {
        this.cancerGenePanel = cancerGenePanel;
    }

}

问题出在试用国家代码上。当我调用一个函数时,我希望试用国家/地区代码在 JSON 输出中可见。当我调用另一个时,我不希望国家/地区代码可见。下面附上两个函数,一个在一个文件中使用,另一个在两个文件中使用。当该函数有一个文件时,我不希望试用国家/地区代码可见。当该函数有两个文件时,我确实希望试用国家/地区代码可见

descriptors = HelperMethods.getBreastCarcinomaDescriptorsFromCsvFile("/Users/edgarjohnson/eclipse-workspace/CsvToJson/src/in.csv");

descriptors = HelperMethods.getBreastCarcinomaDescriptorsFromCsvFile("/Users/edgarjohnson/eclipse-workspace/CsvToJson/src/in.csv", "/Users/edgarjohnson/eclipse-workspace/CsvToJson/src/EU.csv");

HelperMethods.writeJsonFile(descriptors, "JsonOutput.json");

更多背景信息:我从 CSV 文件中获取这些值,在该文件中我读取了 CSV 文件并将 JSON 输出写入多个文件。这是我用来格式化 JSON 文件的代码:

public static List<BreastCarcinomaDescriptor> getBreastCarcinomaDescriptorsFromCsvFile(String fileName, String fileName2) {

        List<BreastCarcinomaDescriptor> descriptorsAndCountrycodes = new ArrayList<BreastCarcinomaDescriptor>();

        BufferedReader bufferedCsvFile = HelperMethods
                .getCsvFileBuffer(fileName);

        BufferedReader bufferedCsvFile2 = HelperMethods
                .getCsvFileBuffer(fileName2);


        List<String> lines = new ArrayList<String>();
        List<String> line2 = new ArrayList<String>();
        HelperMethods.readCsvToStrings(lines, bufferedCsvFile);
        HelperMethods.readCsvToStrings(line2, bufferedCsvFile2);
        List<String> countryList = new ArrayList<String>();
        System.out.println(line2);
        //populate the country list using file2
        countryList = Arrays.asList(line2.get(0).split(","));
        System.out.println(countryList);

        for (String line : lines) {
            BreastCarcinomaDescriptor descriptor= getBreastCarcinomaDescriptorFromCsvLine(line);
            //enrich this object with country code property
            descriptor.getClientData().setTrialCountryCodes(countryList);
            descriptorsAndCountrycodes.add(descriptor);
        }

        return descriptorsAndCountrycodes;
    }

    private static BreastCarcinomaDescriptor getBreastCarcinomaDescriptorFromCsvLine(String line) {
        BreastCarcinomaDescriptor breastCarcinomaDescriptor = new BreastCarcinomaDescriptor();
        String[] data = line.split(",");

        breastCarcinomaDescriptor.setBatchName(data[0]);
        breastCarcinomaDescriptor.getMetadata().setCharset("utf-8");
        breastCarcinomaDescriptor.getMetadata().setSchemaVersion("1.5");

        if(data.length > 5) {
            breastCarcinomaDescriptor.getSampleInfo().setAge(new Integer(data[5].trim()));          
        }
        breastCarcinomaDescriptor.getSampleInfo().setCancerType(data[3].trim());
        if(data.length>4) {
            breastCarcinomaDescriptor.getSampleInfo().setGender(data[4].trim());
        }

        breastCarcinomaDescriptor.getFiles().add(data[1].concat(".*"));
//      breastCarcinomaDescriptor.getClientData().getTrialCountryCodes().add(descriptorsAndCountrycodes[]);
        //breastCarcinomaDescriptor.getClientData().getTrialCountryCodes().add("20");
        breastCarcinomaDescriptor.getClientData().setCancerGenePanel("");
        breastCarcinomaDescriptor.setCaseName(data[1]);

        return breastCarcinomaDescriptor;
    }

我的尝试:我尝试使用自定义序列化仅在我们接收一个文件时显示试用国家/地区代码,但我遇到了问题。

有谁知道我如何完成这项任务。我觉得解决方案很微不足道。但是,我不太了解 Gson 库,而且我是 java 新手。

格式化输出应如何查找接受 1 个文件的函数:

Json output for 1 file

格式化输出应如何查找接受 2 个文件的函数:

Json output for 2 Files

最佳答案

您可以注册两个不同的 TypeAdapters根据调用哪个函数,序列化为您想要的格式。然后,每个函数都使用它自己的类型适配器,并且可以控制转换的细节。

第一个函数

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(ClientData.class, new ClientDataWithCancerGenePanelAdapter());
Gson gson = builder.create();

第二个函数:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(ClientData.class, new ClientDataWithTrialCountryCodesAdapter());
Gson gson = builder.create();

关于java - 修改两个不同函数的 JSON 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51408252/

相关文章:

java - 设计: How much should a method do?

java - MongoDB Spring 字段间数据比较

javascript - 如何从多行和多列的表中获取选中的复选框并作为帖子响应发送

javascript - 如何使用 javascript 将 JSON 对象操作为数组

java - 如何使用 Gson 将 JSON 字符串属性读取到自定义类对象中?

java - Java 中的 Scala 对象

Java 类似功能在列表中不起作用

php - 将 MySQL 和 URLDataSource 作为 JSON 的 Solr DataimportHandler

java - 使用 GSON 将嵌套 JSON 数组解析为数组

java - 传递泛型类型的问题