使用SmarGWT DynamicForm和表单项创建带有xpath的嵌套JSON

使用SmarGWT DynamicForm和表单项创建带有xpath的嵌套JSON,json,xpath,smartgwt,Json,Xpath,Smartgwt,我有一个正在工作的SmarGWT数据源,它返回嵌套的JSON,如下所示: {username:"tom",password:"pwd",userType:{id:1,name:"admin user type"}} private DataSourceIntegerField userTypeIdField; private DataSourceTextField userTypeNameField; private DataSourceTextField userTypeCodeField;

我有一个正在工作的SmarGWT数据源,它返回嵌套的JSON,如下所示:

{username:"tom",password:"pwd",userType:{id:1,name:"admin user type"}}
private DataSourceIntegerField userTypeIdField;
private DataSourceTextField userTypeNameField;
private DataSourceTextField userTypeCodeField;
示例数据源如下所示:

DataSourceTextField usernameField = new DataSourceTextField("username", "User Name");
DataSourceTextField passwordField = new DataSourceTextField("password", "Password");
DataSourceIntegerField userTypeIdField = new DataSourceIntegerField ("id", "User Type Id");
userTypeIdField.setValueXPath("userType/id");
然后我可以将这个DS绑定到一个listgrid和/或表单,这样就可以正常显示数据了

如果我创建一个绑定到相同DS的DynamicForm,我想创建一个新记录。 我有一个用户名和密码文本框,这很好,我有一个SelectItem,它将id返回给usertype(1代表Admin,2代表Oher)

当我们从这个表单获取数据并查看从表单发送到DS的JSON时,它看起来像:

{username:"newuser",password:"newpwd",userTypeId:1}
但我更愿意:

{username:"newuser",password:"newpwd",userType:{id:1}}
因为这个JSON版本的数据会很好地转换成我想要发送给控制器的对象,然后控制器会对这个对象进行归档。但我不知道使用DynamicForm和/或SelectItem是否可以实现这一点

我知道一种可行的方法是在我将JSON发送回进行插入或更新时查看它。在transformRequest中,我可以手动调整JSON以删除userTypeId:1,并在其位置添加userType:{id:1}

或者,我可以查看一个嵌套的数据源,这是我很久没有做过的

我只是不确定从SmarGWT的角度来看,哪一个是更好的主流解决方案

如果我需要更多信息,请告诉我,我会更新问题。
提前感谢您的帮助

这非常简单。首先在UserType的数据源中,我认为这非常简单。您有usertypeId、userTypeName和UserTypeDescription,如下所示:

{username:"tom",password:"pwd",userType:{id:1,name:"admin user type"}}
private DataSourceIntegerField userTypeIdField;
private DataSourceTextField userTypeNameField;
private DataSourceTextField userTypeCodeField;
现在让我们假设您有一个用户数据源,您可能有userId、username、password等字段,如果UserType是其中的一部分,那么您需要执行以下操作:

private DataSourceField userTypeField;  // notice it is a DataSourcField
关于宣言:

    userTypeField = new DataSourceField();
    userTypeField.setTitle("User Type");
    userTypeField.setName("userType");
    userTypeField.setTypeAsDataSource(UserTypeDataSource.getInstance());
如果您知道正在获取嵌套的JSON或XML数据,那么这是一种很好的方法。我还知道有人使用datasourcefield的XPath设置将嵌套JSON格式展平到DataSource bu的情况

在SmartGWT DynamicForm端,还可以获取字段并添加setDataPath绑定,例如:

    userTypeField.setName("userType");
    userTypeField.setPickListWidth(210);
    userTypeField.setTitle("User Type");
    userTypeField.setOptionDataSource(userTypeDS);
    userTypeField.setRequired(true);
    userTypeField.setDisplayField("userTypeName");
    userTypeField.setValueField("userTypeId");
    userTypeField.setDataPath("userType/userTypeId");
因此,如果您有一个用户DynamicForm,并且希望设置一个UserType,那么数据路径将保留嵌套的JSON,因此您将有如下内容:

user:
{"userId":1,"username":"test","password":"password",
    "userType":{"userTypeId":2}
}
这看起来很简单,但也许这会帮助其他人