Collections Drools 6.2如何在声明的类型中使用ArrayList?

Collections Drools 6.2如何在声明的类型中使用ArrayList?,collections,types,drools,rules,declare,Collections,Types,Drools,Rules,Declare,以下是我的DLR文件中的内容: package mytypes; declare Person firstName : String lastName : String address : java.util.ArrayList end declare Address city : String state : String end rule "city" when p : Person() Address(city == "Dalla

以下是我的DLR文件中的内容:

package mytypes;

declare Person
    firstName : String
    lastName : String    
    address : java.util.ArrayList
end

declare Address
    city : String
    state : String
end

rule "city"
when 
 p : Person()
 Address(city == "Dallas") from p.address
then
System.out.println("city rule fired");
end
我使用gson将json转换为使用FactType的Person类型的ojbect。见下文:

    FactType ft  = base.getFactType( "mytypes","Person" );
    Object oPerson = ft.newInstance();      
    Gson gConverter = new Gson();
    Object input = gConverter.fromJson(fact, oPerson.getClass());
这是我的json:

{"firstName":"John","lastName":"Smith","address":[{"city":"Dallas","state":"TX"}]}
我把东西拿回来。这是它在内存中的外观:

Person( firstName=John, lastName=Smith, address=[{city=Irving, state=TX}] )
我的规则是不会被解雇,因为正如您所看到的,在Address集合中没有Address类型。有人知道怎么做吗

或者,如果我不使用json获取Person对象,而是使用“getFactType”手动构建它,并使用“set”设置属性,那么我就可以启动规则。下面是我如何手动构建它

    FactType ftPerson  = base.getFactType( "mytypes","Person" );
    Object oPerson = ft.newInstance();
    ArrayList al = new ArrayList();
    FactType ftAddress  = base.getFactType( "mytypes","Address" );
    Object add = ftAddress.newInstance();
    ftAddress.set(add, "city", "Dallas");
    ftAddress.set(add, "state", "TX");
    al.add(add);
    ftPerson.set(oPerson, "address", al);
这是Person对象在内存中的外观,请注意Address集合中指定的Address类型:

Person( firstName=null, lastName=null, address=[Address( city=Irving, state=TX )] )

我希望我已经解释了整个场景。如何仍然使用json并使其正常工作?

由于ArrayList是一个通用集合,Gson在处理json字符串时无法正确标识地址对象的类型。要完成您正在尝试的操作,最简单的方法是使用数组而不是ArrayList:

declare Person
  firstName : String
  lastName : String    
  address : Address[]
end
在这种情况下,Gson应该正确地选择类型,规则将触发