Kotlin数据类JSON反序列化

时间:2018-10-04 15:50:48

标签: kotlin nullpointerexception

我正在尝试将ApiEmployee转换为Employee并围绕它进行测试。我很陌生,对Kotlin中的 null 感到困惑。

ApiEmployee将用于JSON转换,因此它可能缺少name字段,或者为空,或者为null。在这种情况下,我不想添加到列表中并安全地忽略它。

我在Method threw 'kotlin.KotlinNullPointerException at exception.得到apiEmployee.name!!.isNotBlank()

ApiEmployee

data class ApiEmployee(val image: String? = "image",
                   val name: String? = "name test",
                   val description: String? = "",
                   val id: String? = "")

员工

data class Employee(val imagePath: String, val id: String)

EmployeeConverter (将ApiEmployee转换为Employee)

fun apply(apiEmployees: List<ApiEmployee>): List<Employee> {
    val employees = mutableListOf<Employee>()
    for (apiEmployee in apiEmployees) {
      if (apiEmployee.name!!.isNotBlank()){
         employees.add(Employee(apiEmployee.image!!, apiEmployee.id!!)
      }
    }
}

EmployeeConverterTest

  @Test
fun `should not add employee without name into employee list`() {
  val invalidApiEmployee = ApiEmployee("image", null, "description", "id")
  val convertedEmployees : List< Employee > =  employeeConverter.apply(listOf( invalidApiEmployee))

  assertThat(convertedEmployees.size).isEqualTo(0)
}

2 个答案:

答案 0 :(得分:0)

传递名称的值。

ApiEmployee("image", "name", "description", "id")

(或)

按以下所述更改if条件(使用?运算符):-

if (apiEmployee.name?.isNotBlank()){
  

?。执行安全调用(如果   接收者不为空)

     

!断言一个表达式是   非空

代码断言该名称不为null,并检查是否为空。

可能,我认为您正在尝试执行null而不是空白检查。您可以使用? operator (safe call)。这意味着isNotBlank()仅在名称不为null时被执行。

答案 1 :(得分:0)

您要执行的操作是先检查名称是否为空,然后再为空。

        function connectedNodes() {
    var poligono = g.selectAll("path");
    var result = datosPoli.features;
    for (var i = 0; i < result.length; i++) {
        var poligonoNombre = result[i].properties.Name;
    }

    if (toggle == 0) {
  //Reduce the opacity of all but the neighbouring nodes
  d = d3.select(this.parentNode).datum();
        r = d3.select(this).datum();

      nodesAll
    .transition()
    .style("opacity", function (o) {
                return neighboring(d, o) | neighboring(o, d) ? 1 : 0;
            })
  ;

  lineas
    .transition()
    .style("opacity", function (o) {
                return d.index==o.source.index | d.index==o.target.index ? 0.5 : 0;
            })
  ;

        poligono
            .filter(function(d){
                for (var i = 0; i < result.length; i++) {
                    var poligonoNombre = result[i].properties.Name;
                    return poligonoNombre;
                }
                return d.id === poligonoNombre;
            })
            .attr('fill-opacity', 1)
        ;

        text
            .transition()
            .style('opacity', function(o){
                    return neighboring(d, o) | neighboring(o, d) ? 1 : 0;
        })

        toggle = 1;

} else {
        // devuelve los nodos a la normalidadlos links invisibles
  nodesAll
    .transition()
    .style("opacity", 1)
        ;

  lineas
    .transition()
    .style("opacity", 0)
  ;

        poligono
            .attr("fill-opacity", 0)
        ;

        text
            .transition()
            .style('opacity', 1)
        ;

  toggle = 0;
}
}

仅当name不为null时,val employeeNameIsNotEmpty = apiEmployee.name?.isNotBlank() ?: false if (employeeNameIsNotEmpty) { // do stuff } 才会运行并返回一个值。如果name为null,则?:右侧的语句将返回其值,在这种情况下应为false。

但是在这种情况下,Kotlin已经将这个特定的示例放入扩展函数中

  

.isNullOrBlank()

因此您可以将其更改为:

apiEmployee.name?.isNotBlank()

请注意,您确实不希望这样做if (!apiEmployee.name.isNullOrBlank()) { // do stuff } 。 因为image和id仍然可以为null,并且使您的代码崩溃并出现相同的错误。