流口水6.2如何在已声明的类型中使用arraylist



这是我在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使用FactType将我的JSON转换为类型人的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}] )

我的规则没有被解雇,因为您可以看到地址地址>地址集合中没有类型。有人知道如何使它起作用吗?

另外,如果我不使用JSON来获取人对象,并且使用" getFactType"手动构建它,并使用"设置"设置属性,那么我就可以启动规则。这是我手动构建的方式

    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( firstName=null, lastName=null, address=[Address( city=Irving, state=TX )] )

我希望我已经解释了完整的情况。我如何仍然可以使用JSON并使它运行?

由于arraylist是一个通用集合,因此在处理JSON字符串时,GSON无法正确识别地址对象的类型。完成您要做的事情的最简单方法是使用数组而不是数组列表:

declare Person
  firstName : String
  lastName : String    
  address : Address[]
end

在这种情况下,gson应该正确拿起类型,规则将启动。

相关内容

  • 没有找到相关文章

最新更新