使用正确的扩展名将列表转换为Java中的JSON

时间:2018-10-26 00:06:48

标签: java json servlets header gson

我试图用不同的代码创建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");

我在这里需要使用什么正确的标题?

1 个答案:

答案 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实例而不是包含列表即可。