我试图用不同的代码创建List
个错误,并使用JSON
将它们转换为gson
。
String jsonString = gson.toJson(Errors.getErrors());
这是课程:
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
返回String并设置了此标头,这删除了“错误”。
resp.setHeader("Content-Type", "application/json");
我在这里需要使用什么正确的标题?
答案 0 :(得分:1)
很显然,您应该了解,所需的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);
}
第二个解决方案-如果无法将字段和方法设为静态,则添加一个新方法以通过私有构造函数获取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);
}
}
//要在序列化过程中包含静态字段并仅忽略瞬态字段-如果不这样做,则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 );
编辑:
对于第二个解决方案,您不需要专用的构造函数和新方法-getErrorsInstance()
。您可以简单地将new Errors()
馈送到gson.toJson(...)
。您只需要在反序列化中包含静态字段,并且对于解决方案1同样适用。因此,您无需修改任何代码,只需使用GsonBuilder
确保包含静态字段并传递Errors
实例而不是包含列表即可。