繁体   English   中英

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

[英]Converting List to JSON in Java with correct extension

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

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返回字符串并设置此标头,这会删除“错误”。

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

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

显然,您应该了解所需的 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实例,然后从GsonBuilder创建Gson对象,以便在序列化期间可以包含静态字段。

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

暂无
暂无

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

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