我有一个使用Jersey构建的REST服务,并部署在AppEngine中.REST服务实现使用application/json媒体类型的动词PUT.数据绑定由Jackson执行.
动词使用JSON表示的企业部门关系
{"name":"myEnterprise", "departments":["HR","IT","SC"]}
Run Code Online (Sandbox Code Playgroud)
在客户端,我使用gson将JSON表示转换为java对象.然后,我将对象传递给我的REST服务,它工作正常.
问题:
当我的JSON表示在集合中只有一个项目时
{"name":"myEnterprise", "departments":["HR"]}
Run Code Online (Sandbox Code Playgroud)
该服务无法反序列化该对象.
ATTENTION: /enterprise/enterprise: org.codehaus.jackson.map.JsonMappingException:
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at
[Source: org.mortbay.jetty.HttpParser$Input@5a9c5842; line: 1, column: 2
Run Code Online (Sandbox Code Playgroud)
正如其他用户所报告的那样,解决方案是添加标志ACCEPT_SINGLE_VALUE_AS_ARRAY(例如,Jersey:无法从String中反序列化ArrayList的实例).然而,我并不是在控制ObjectMapper,因为在服务方面它是由Jackson透明地制作的.
题:
有没有办法在服务端配置ObjectMapper以启用ACCEPT_SINGLE_VALUE_AS_ARRAY?注释?web.xml中?
代码细节
Java对象:
@XmlRootElement
public class Enterprise {
private String name;
private List<String> departments;
public Enterprise() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getDepartments() {
return departments;
}
public void setDepartments(List<String> departments) {
this.departments …Run Code Online (Sandbox Code Playgroud) 当您创建一个简单的旧Java对象,该对象旨在从Firebase序列化和反序列化时,有没有办法使用该ServerValue.TIMESTAMP值?
例如,假设我想要一个对象,其中一个属性是最后一次编辑,并且您想要使用该ServerValue.TIMESTAMP值.
在POJO类中,您可能具有:
private String timeLastChanged;
Run Code Online (Sandbox Code Playgroud)
要么
private Map<String, String> timeLastChanged;
Run Code Online (Sandbox Code Playgroud)
在第一个例子中String,我遇到了设置问题timeLastChange = ServerValue.TIMESTAMP;,因为ServerValue.TIMESTAMP是Map.
在第二个例子中,Map<String, String>我得到了一个"未能去抖"的错误,因为它无法正确地将数据库中存储的long反序列化为一个Map<String, String>.这有什么工作吗?
目前,Google的ServerValue.TIMESTAMP退货版本将{".sv":"timestamp"}用作Firebase的指令,以便在将数据保存到Firebase服务器后使用服务器时间戳填充该字段.
但是,当您在客户端创建数据时,您还没有实际的时间戳(即用作创建日期).在初始保存和随后的检索之后,您只能访问时间戳,我想 - 有时候太晚了,不太优雅.
在Google之前:
更新:忽略此部分,因为它不正确 - 我误解了这些例子.ServerValue.TIMESTAMP总是回来的{".sv":"timestamp"}.
据我所知,在google之前的Firebase中,似乎有一个服务器生成的时间戳可用于获取实际时间戳:
import com.firebase.client.ServerValue;
ServerValue.TIMESTAMP // eg. 1466094046
Run Code Online (Sandbox Code Playgroud)
问题:
注意:
我不打算new Date()在客户端使用,因为我一直在阅读它并不安全,但如果你认为不同,请分享你的想法.
我是Firebase的新手,到目前为止我一直非常喜欢它.我遇到了问题; 我正在使用类似于教程大纲的FirebaseListAdapter:https://github.com/firebase/AndroidChat
要使用FirebaseListAdapter,我需要使用数据模型对象(以使自动绑定工作得很好).问题是我还想保留该模型对象的时间戳值,并且我想从Firebase服务器获取时间戳.
我目前没有工作的是一个类DataModelObject(类似于演示示例中的com.firebase.androidchat.Chat),其构造函数如下:
DataModelObject(String data1, String data2, Map enQTimeStamp)
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用这样:
DataModelObject dmo = new DataModelObject ("foo", "bar", ServerValue.TIMESTAMP);
myFirebaseRef.push().setValue(dmo);
Run Code Online (Sandbox Code Playgroud)
当我尝试运行该代码时,这会导致JsonMappingException.我在这里找到了一个代码片段:
https://www.firebase.com/blog/2015-02-11-firebase-unique-identifiers.html
但是值得注意的是,在Android代码示例的第4行,这将导致编译时错误(因为他试图将ServerValue.TIMESTAMP放入Map中,而TIMESTAMP是Map本身)
正确的方法是什么,并保持与FirebaseListAdapter的兼容性?
我的JSON字符串具有嵌套值.
就像是
"[{"listed_count":1720,"status":{"retweet_count":78}}]"
我想要的价值retweet_count.
我正在使用杰克逊.
下面的代码输出" {retweet_count=78}"而不是78.我想知道我是否能以PHP的方式获取嵌套值,即status->retweet_count.谢谢.
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
public class tests {
public static void main(String [] args) throws IOException{
ObjectMapper mapper = new ObjectMapper();
List <Map<String, Object>> fwers = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", new TypeReference<List <Map<String, Object>>>() {});
System.out.println(fwers.get(0).get("status"));
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道如何使用Firebase的ServerValue.TIMESTAMP方法,当我想在Firebase服务器上创建时间戳,然后将其检索到本地客户端时.
在Firebase指南中,只有javascript对此案例有更详细的描述,但我很难想到如何将其转换为我的Android应用程序.
提前致谢!