我有一个成功运行的SmartGWT 4.0和Spring MVC应用程序。我定义了DataSources,他们调用正确的RESTful Web服务并返回JSON。
我遇到的问题是,如果我将用户的ID传递给我的RESTful Web服务,它就可以运行。单个User对象返回给我:
{data: "username":tholmes,"password":"mypwd",
"other":{"field1":"data1","field1":"data1","field1":"data1"}}
然后我可以使用JSOHelper来获取属性,删除属性和添加新属性。 我相信这就是transformResponse的意图。
现在,如果我得到所有用户的列表,那么从同一个RESTful Web服务中,我得到一个User对象的ArrayList,现在看起来像JSON数据:
[
{data: "username":tholmes,"password":"mypwd",
"other":{"field1":"data1","field1":"data1","field1":"data1"}},
{data: "username":tholmes,"password":"mypwd",
"other":{"field1":"data1","field1":"data1","field1":"data1"}},
{data: "username":tholmes,"password":"mypwd",
"other":{"field1":"data1","field1":"data1","field1":"data1"}},
]
因此,我之前更改JSON的代码正在运行,只有一个项目。 现在当我有多个项目时,代码不起作用。 我需要知道的是,如何最好地解决这个问题。
我认为在某一点上,所有内容都作为一组对象返回到SmartGWT数据源中,但可能情况不再如此。
我可能需要检查行数,如果有多于1行,则迭代所有返回的数据。
如果还有其他更容易,更主流的解决方案,那就太棒了。
谢谢!
答案 0 :(得分:0)
您的两个JSON都不是有效的JSON。
请在The JSON Validator 上查看。
这是第一个有效的JSON。
{
"username": "tholmes",
"password": "mypwd",
"other": {
"field1": "data1"
}
}
这是第二个有效的JSON。
[
{
"username": "tholmes",
"password": "mypwd",
"other": {
"field1": "data1"
}
},
{
"username": "tholmes",
"password": "mypwd",
"other": {
"field1": "data1"
}
},
{
"username": "tholmes",
"password": "mypwd",
"other": {
"field1": "data1"
}
}
]
试试这个示例代码:
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(new File("resources/abc1.txt")));
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
reader.close();
Gson gson = new Gson();
UserDetails[] userDetails = gson.fromJson(builder.toString(), UserDetails[].class);
System.out.println(userDetails.length);
...
class UserDetails {
public String username;
public String password;
public Map<String, String> other;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Map<String, String> getOther() {
return other;
}
public void setOther(Map<String, String> other) {
this.other = other;
}
}
注意:文本文件包含第二个JSON字符串,如上所示。
答案 1 :(得分:0)
我希望有一个快速的答案,非常具体地使用JSOHelper和SmartGWT数据源。经过一番思考......我意识到从RESTful webv服务中带回来的Object已经通过一次交互并创建了JSON。
在RESTful Web服务中,您可以拥有一个包含数百条(甚至数千条)记录的ArrayList。要在SmartGWT数据源中迭代所有这些,使用JSOHelper看起来效率不高。
我在想...如何在不影响后端的情况下在后端更改此内容。 在其他电子邮件中,它讨论了构建自定义序列化器/反序列化器以帮助将对象转换为JSON。
然后我从XML Jackson映射器中找到了@JSonProperty。这是我们的项目,其中包含我们的实体和dao。我们之前在后端添加了最新的Jackson 2 Fast Mapper到这个项目。因此,在实体类中,我们可以:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonProperty("sommeOtherId")
private long id;
然后我不需要在SmartGWT数据源中做任何事情,JSON就像我想要的那样完全按照我想要的字段名称。
我希望这有助于其他人。