gson 如何在从SpringBoot应用程序的服务发送到前端应用程序时保持JSON的顺序?

gg0vcinb  于 2022-11-06  发布在  Spring
关注(0)|答案(1)|浏览(185)

我正在开发一个springboot应用程序。
我有一个包含以下字段的类

class MyClass
{
  String s1;
  String s2;
  String s3;
  String s4;

  //getters setters constructors
}

我正在调用一个API,它反过来又调用一个服务。

public String myService()
{
    JSONArray arr1 = new JSONArray();
    for (Items item : itemsList) 
    {
      JSONObject itemObj = new JSONObject();
      itemObj.put("s1","Value1");
      itemObj.put("s2","Value2");
      itemObj.put("s3","Value3")
      itemObj.put("s4","Value4");

      arr1.put(itemObj);
    }

    JSONObject out = new JSONObject();
    out.put("total_Items", arr1);
    return out.toString();  // this is org.json.JSONObject
}

这样,当点击前端Angular 应用程序中的按钮时,我就可以获得以重新排序的成员作为列的Excel。
我想要的是,在导出到Excel工作表时,列中成员的顺序保持不变。

s1|第二节|第三节|s4//按照上例

我还有许多其他的服务,它们返回不同类型的对象(除了这里提到的MyClass),所以我想从后端本身以定义的顺序(按照类中成员的顺序)返回元素。
我知道JSON不允许我们保留顺序,因为它在内部使用HASHMAP。
有没有办法返回JSON响应,使其顺序与类成员的顺序保持一致?
我也尝试过以下面的方式使用GSON。

public String myService()
{
  MyClass itemsArray[] = new MyClass[itemsList.size()];
  int i=0;
  for (Items item : itemsList) 
  {
    MyClass itemObj = new MyClass();
    itemObj.setS1("Value1");
    itemObj.setS2("Value2");
    itemObj.setS3("Value3")
    itemObj.setS4("Value4");

    itemsArray[i]=itemObj;
  }
  Gson gson = new Gson();
  return gson.toJson(itemsArray);  // this is java.lang.String
}

在这种情况下,我可以得到API响应(在POSTMAN上),元素以有序的方式,但当导出前端Angular 应用程序时,它冻结在下载屏幕上。
我试着随机转换到JSONObject和其他东西,但无法使代码正常工作。
是否有任何问题可以在后端解决...或者只需要在前端完成一些事情?
先谢谢你。

toiithl6

toiithl61#

如果您想使用DataStructure,请使用下面给出的LinkedHashMap。它将按插入顺序进行序列化。
第一个
如果要按排序顺序序列化,请使用TreeMap,它将按排序键序列化
第一个
这可以通过使用@JsonPropertyOrder注解的Jackson库来完成。
您可以定义元素的顺序,如下所示:class @JsonPropertyOrder({“s3”,“s2”,“s1”,“s4”})
请参考以下工作示例

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.istack.NotNull;
import java.io.IOException;
import java.util.UUID;

@JsonPropertyOrder({ "id", "password", "name", "email", "enabled" })
public class UserResource {
    private UUID id;
    @NotNull
    private String name;
    @NotNull
    private String email;
    private boolean enabled;
    private String password;

    public UserResource(UUID id, String name, String email, boolean enabled, String password) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.enabled = enabled;
        this.password = password;
    }

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public static void main(String args[]){
        ObjectMapper mapper = new ObjectMapper();
        try {
            UserResource student = new UserResource(UUID.randomUUID(), "sheel", "sheel@c4c.com",true, "$$$$$$%%##^^$DSGHHH");
            String jsonString = mapper
                    .writerWithDefaultPrettyPrinter()
                    .writeValueAsString(student);
            System.out.println(jsonString);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

和输出,如下所示

{
  "id" : "fbfcd21d-731e-4acb-9fec-90a499e47cc9",
  "password" : "$$$$$$%%##^^$DSGHHH",
  "name" : "sheel",
  "email" : "sheel@c4c.com",
  "enabled" : true
}

相关问题