gpt4 book ai didi

java - 在 Java 中将列表转换为具有正确扩展名的 JSON

转载 作者:行者123 更新时间:2023-11-30 05:56:58 27 4
gpt4 key购买 nike

我正在尝试使用不同的代码创建错误列表,并使用 gson 将它们转换为 JSON

String jsonString = gson.toJson(Errors.getErrors());

这是类(class):

public class Errors {

private static List<SingleError> errors = new ArrayList<>();

public static List<SingleError> getErrors() {
return errors;
}

public static void addError(SingleError singleError) {
errors.add(singleError);
}

}

我得到的输出:

[
{
"code": "bad_signal"
}
]

我需要的输出:

{
"errors": [
{
"code": "bad_signal"
}
]
}

我在 Errors 类中缺少什么来获取我需要的输出?
如果将其添加到类中而不只是添加字符串到 json 转换,那就更好了。

编辑
正如 schomsel 所建议的,我应该使用这一行来获取我需要的输出。

gson.toJson(Collections.singletonMap("errors", Errors.getErrors()))

它确实有效,但我没有提到我还使用 Servlet 返回字符串并设置此 header ,这会删除“错误”。

resp.setHeader("Content-Type", "application/json");

我需要在这里使用的正确 header 是什么?

最佳答案

显然,您应该明白所需的 json 表示是针对 Errors 类本身的,而不是包含 erros 列表,因此您的代码需要进行调整,以便您可以传递 Errors 类实例作为 - gson.toJson(...)

的输入

两种解决方案,

第一个解决方案 - 将 Errors 字段和方法设为非静态,并传递 Errors 实例而不是要调用的 errors 列表 - gson.toJson(ErrorsInstance);

import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;

class Errors {
private List<SingleError> errors = new ArrayList<>();
public List<SingleError> getErrors() {
return errors;
}

public void addError(SingleError singleError) {
errors.add(singleError);
}

第二个解决方案 - 如果字段和方法无法设为静态,则添加一个新方法以通过私有(private)构造函数获取 Errors 实例,然后从 创建 Gson 对象>GsonBuilder 以便在序列化期间可以包含静态字段。

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

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

class Errors {


// private constructor
private Errors(List<SingleError> errors) {
Errors.errors = errors;
}

private static List<SingleError> errors = new ArrayList<>();

public static List<SingleError> getErrors() {
return errors;
}

// New method to return Errors instance
public static Errors getErrorsInstance() {
return new Errors(errors);
}

public static void addError(SingleError singleError) {
errors.add(singleError);
}

}

//在序列化期间包含静态字段并仅忽略 transient 字段 - 如果不这样做,则 json 将为空

GsonBuilder gsonBuilder = new GsonBuilder();
// Allowing the serialization of static fields
gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);
// Creates a Gson instance based on the current configuration
Gson gson = gsonBuilder.create();
Errors errorsInstance = Errors.getErrorsInstance();
String jsonStringTest = gson.toJson(errorsInstance );

编辑:

对于第二种解决方案,您不需要私有(private)构造函数和新方法 - getErrorsInstance() 。您只需将 new Errors() 提供给 gson.toJson(...) 即可。您需要的只是反序列化中包含静态字段,并且对于解决方案#1 也同样适用。因此,您不需要修改任何代码,只需使用 GsonBuilder 确保包含静态字段并传递 Errors 实例而不是包含的列表。

关于java - 在 Java 中将列表转换为具有正确扩展名的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52999702/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com