以下是我在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}] )
我的规则不会被解雇,因为您可以看到地址集合中没有地址类型。有谁知道如何使它工作?
或者,如果我不使用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对象在内存中的显示方式,并注意地址集合中地址类型的指定方式:
Person( firstName=null, lastName=null, address=[Address( city=Irving, state=TX )] )
我希望我已经解释了完整的情景。我怎样才能使用json并使其仍然有效?
答案 0 :(得分:0)
由于ArrayList是一个通用集合,因此Gson在处理JSON字符串时无法正确识别地址对象的类型。完成您要做的事情的最简单方法是使用数组而不是ArrayList:
declare Person
firstName : String
lastName : String
address : Address[]
end
在这种情况下,Gson应该正确选择类型并且规则将会触发。