Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中为请求对象定义集合字段时,更好的做法是什么?_Java_Json_Interface_Request_Jackson - Fatal编程技术网

在Java中为请求对象定义集合字段时,更好的做法是什么?

在Java中为请求对象定义集合字段时,更好的做法是什么?,java,json,interface,request,jackson,Java,Json,Interface,Request,Jackson,我试图找出在Java中定义请求对象时哪种方法更好。假设我们有以下两个请求: // use array for booksNames class RequestA { private String requestId; private String[] booksNames; } // use set for booksNames class RequestB { private String requestId; private Set<String> bo

我试图找出在Java中定义请求对象时哪种方法更好。假设我们有以下两个请求:

// use array for booksNames
class RequestA {
   private String requestId;
   private String[] booksNames;
}

// use set for booksNames
class RequestB {
   private String requestId;
   private Set<String> booksNames;
}
//使用数组作为名称
类请求{
私有字符串请求ID;
私有字符串[]名称;
}
//对书名使用set
类请求B{
私有字符串请求ID;
私人书名;
}
所以基本上,我不确定这里哪个更好,假设
booksNames
必须是唯一值的集合,那么为什么不在这里使用
Set
。我正在阅读我们的代码库,看到人们正在使用数组来处理这样的字段,这让我很困惑。(我找不到这些人,因为他们都离开了公司,所以我在这里询问)

顺便说一句,我们使用Jackson对象映射器将Java请求对象映射到Json字符串。也许这就是原因


提前感谢您的帮助,我已经在这个简单的问题上花了几个小时,希望我能从这里的人那里得到一些见解。

使用第二种方法,因为您不需要担心java.lang.ArrayIndexOutOfBoundsException:)顺便说一句,您也可以使用json对象作为第二种方法,如下所示:

我们使用Jackson对象映射器将Java请求对象映射到 Json字符串。也许这就是原因

这不可能是杰克逊处理Set/List的原因


使用Array/List Vs Set的一个可能的理由是,假设您希望验证请求并让使用者知道他们发送了重复的Bookname(通过HTTP 400),而不是静默地清理数据并继续操作。

哪一个更好可能取决于代码中其他地方对
booknames
的使用。数组和某些集合类型之间的区别主要在于集合类型不能保存诸如
int
之类的基元值,但需要诸如boxed
Integer
之类的对象类型

当然,使用阵列可能会带来一些内存和性能方面的好处,但这通常不会起到很大作用。
数组
可以保存重复项,但
列表也可以保存重复项。有关更多详细信息,请参阅

推理可以是任何东西,但它可能是有效的,例如,如果
booksNames
作为数组存在于代码中的任何其他地方。为什么要在序列化之前将其转换为

另一方面,如果它是-----这里是数组类型和集合类型,我会首先考虑事情——就像你提到的一样——可以有重复(如果你不知道询问人们接受/接受规范),并且重构代码只通过你决定使用的集合类型。使用集合(和流,而不是一直调用array.asList())更有趣


注意:对于后者-我应该添加IMHO-我指的是
booksNames
来回转换的情况-从数组到集合再到数组。如果某个类/方法在其复杂的逻辑中使用数组,那么重写(或重写)就很容易了构造函数/方法,以接受集合类型而不是数组,并使其仅将集合类型转换为数组作为其第一个作业。

JSON数组
可以在
Java
中映射到:
array
Java.util.List
Java.util.Set
。关于阵列:

值的有序列表。在大多数语言中,这是作为 数组、向量、列表或序列

最自然的方法是在
Java
中将它映射到一个数组。它保持着秩序,直截了当。当您想要使用
java.util.List
java.util.Set
时,您需要知道默认情况下使用的是哪个实现,以及它的副作用是什么

java.util.Set
的情况下,您需要记住顺序是可以更改的。因此,如果这很重要-
Set
是一个不好的选择

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

public class JsonApp {

  public static void main(String[] args) throws IOException {
    String json = "[\"B\",\"A\",\"B\",\"C\",\"A\",\"B\"]";
    ObjectMapper mapper = new ObjectMapper();

    // array
    String[] array = mapper.readValue(json, String[].class);
    System.out.println(array.getClass().getName() + ": " + Arrays.toString(array));

    // list
    List<String> list = mapper.readValue(json, List.class);
    System.out.println(list.getClass().getName() + ": " + list);

    // set
    Set<String> set = mapper.readValue(json, Set.class);
    System.out.println(set.getClass().getName() + ": " + set);
  }
}
如图所示,您可以看到
String[]
java.util.ArrayList
显示了相同的结果,因为
java.util.ArrayList
在幕后使用数组。使用
设置时
输出不会保持顺序并删除重复项

在这种情况下,您需要验证请求并检查客户端是否发送了重复的请求。您不能使用默认的
Set
mapping。另外,
Set
的内存占用比数组的内存占用更大

[Ljava.lang.String;: [B, A, B, C, A, B]
java.util.ArrayList: [B, A, B, C, A, B]
java.util.HashSet: [A, B, C]