这是我在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应该正确拿起类型,规则将启动。