我有一个像这样的JSON文件:
[
{
"number": "3",
"title": "hello_world",
}, {
"number": "2",
"title": "hello_world",
}
]
Run Code Online (Sandbox Code Playgroud)
在文件有根元素之前我会使用:
Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);
Run Code Online (Sandbox Code Playgroud)
代码,但我想不出如何编写Wrapper类,因为根元素是一个数组.
我尝试过使用:
Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);
Run Code Online (Sandbox Code Playgroud)
有:
public class Wrapper{
String number;
String title;
}
Run Code Online (Sandbox Code Playgroud)
但是没有运气.我怎么能用这种方法读这个?
PS我有这个工作使用:
JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");
Run Code Online (Sandbox Code Playgroud)
但我更愿意知道如何使用这两种方法(如果可能的话).
在GSON中获取您执行的对象列表
Gson gson = new Gson();
Type token = new TypeToken<List<MyType>>(){}.getType();
return gson.fromJson(json, token);
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我想更进一步,让MyType参数化,这样我就可以有一个通用的函数来解析这个代码的对象列表
// the common function
public <T> List<T> fromJSonList(String json, Class<T> type) {
Gson gson = new Gson();
Type collectionType = new TypeToken<List<T>>(){}.getType();
return gson.fromJson(json, collectionType);
}
// the call
List<MyType> myTypes = parser.fromJSonList(jsonString, MyType.class);
Run Code Online (Sandbox Code Playgroud)
遗憾地返回一个StringMaps数组,而不是类型.T被解释为另一种泛型类型,而不是我的类型.任何解决方法?
我在Android应用程序中实现Json反序列化时遇到一些问题(使用Gson库)
我上过这样的课
public class MyJson<T>{
public List<T> posts;
}
Run Code Online (Sandbox Code Playgroud)
反序列化调用是:
public class JsonDownloader<T> extends AsyncTask<Void, Void, MyJson<T>> {
...
protected MyJson<T> doInBackground(Void... params) {
...
Reader reader = new InputStreamReader(content);
GsonBuilder gson = new GsonBuilder();
Type collectionType = new TypeToken<MyJson<T>>() {}.getType();
result = gson.create().fromJson(reader, collectionType);
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象.当我使用MyObject而不是T时,一切正常,MyObject正确.
那么有没有办法在不创建自定义反序列化器的情况下实现反序列化调用?
有谁知道一个java库可以轻松地将java Maps编码为json对象,反过来呢?
UPDATE
由于原因无法解释(我有时讨厌)我不能在我的环境中使用泛型.
我想要做的是做这样的事情:
Map a = new HashMap();
a.put( "name", "Oscar" );
Map b = new HashMap();
b.put( "name", "MyBoss");
a.put( "boss", b ) ;
List list = new ArrayList();
list.add( a );
list.add( b );
String json = toJson( list );
// and create the json:
/*
[
{
"name":"Oscar",
"boss":{
"name":"MyBoss"
}
},
{
"name":"MyBoss"
}
]
*/
Run Code Online (Sandbox Code Playgroud)
并能够再次将其作为地图列表
List aList = ( List ) fromJson( jsonStirng );
Run Code Online (Sandbox Code Playgroud) 我在StackOverflow中知道很多类似的问题,但没有解决我的问题.
我有一个通用数据类:
data class ServiceCall<out T>(val result: T?, val exception: String?, val pagination: String?, val stringResult: String?)
Run Code Online (Sandbox Code Playgroud)
我想这样使用:
Gson().fromJson(json, ServiceCall<SurveyListModel>::class.java).result
Run Code Online (Sandbox Code Playgroud)
IDE显示错误:只允许在类文字的左侧使用类
怎么解决这个?提前致谢.
我想模仿Gmail有关通知栏通知的应用行为,该通知栏符合推荐的Android模式:http://developer.android.com/design/patterns/notifications.html
当应用程序处于后台并收到新电子邮件时,我会在通知栏中收到通知,如下所示:
Line 1 : Jane Smith
Line 2 : Hi John, this is a sample message...
Run Code Online (Sandbox Code Playgroud)
也就是说,一个特定于单个消息的通知,并点击它会导致显示该特定电子邮件的屏幕.如果我通过滑动或"全部清除"清除通知,那么当我收到新消息时,我将收到另一个特定于消息的通知.但是,如果我不清除它并收到另一封电子邮件,则通知将变为摘要通知,说明"2条新消息",然后点击它会进入收件箱.
我知道如何更新通知,问题是如何确定通知栏中仍有哪些通知(如果有).答案并不那么简单,因为通知不会反映我有多少未读消息,它必须通过点击通知或清除通知来反映用户仍未确认哪些消息.
我是否应该通过保留我们发布的通知列表,被点击的通知(内容意图)和清除的通知(删除意图)来跟踪通知?我不认为这种方法足够安全......例如:如果通知因为我启动手机而被清除会怎样?我应该在哪里跟踪仍然显示的通知?共享偏好?
你通常如何解决这个问题?
我有以下界面:
public interface GenericMethods {
public String getString();
}
Run Code Online (Sandbox Code Playgroud)
通过这个接口,我实现了这个枚举:
public enum SpecificEnum implements GenericMethods {
A("NOT"), B("RELATED"), C("TEXT");
SpecificEnum(String string) {
this.string = string;
}
private String string;
@Override
public String getString() {
return this.string;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够使用参数调用函数SpecificEnum.class,并能够调用values()该参数上的函数,以及返回的数组元素上的接口方法。像这样的东西:
class Main {
public static void main(String[] args) {
for (GenericMethods gm : getEnums(SpecificEnum.class)) {
System.out.printf(gm.getString());
}
}
public static T[]<T extends GenericMethods> getEnums(Class<T> enum1) {
enum1.values();
}
}
Run Code Online (Sandbox Code Playgroud)
然而,经过大量搜索后,我还没有遇到使用泛型和枚举同时实现接口的案例。我也对泛型类型进行了很多思考,但我找不到能够调用values()泛型枚举类的正确语法。主要目标是以相同的方式管理多个相关的枚举。
我已经使用了ArrayList<>和JsonArray作为适配器中的数据集.我发现的一个主要区别是适配器中本地数据的数据集更改没有反映在JsonArray的调用类中.
我想知道哪一个更好,我的观察是正确的.
此外,如果我的数据集涉及从Web服务中提取数据(这给我提供Json表单数据),那么我将其更改为ArrayList <>会更好.
我有一个像这样的JSON数组:
[
{"_id": {"$oid":"57e9e4b1f36d281c4b330509"}, "user": "edmtdev" },
{"_id": {"$oid":"57e9e4cec2ef164375c4c292"}, "user": "admin1234" },
{"_id": {"$oid":"57ea1b0ac2ef164375c5ff1e"}, "username": "admin34" }
]
Run Code Online (Sandbox Code Playgroud)
这是我的User.class,用于存储所有数据:
public class User{
private Id id;
private String user;
public Id getId() {
return id;
}
public void setId(Id id) {
this.id = id;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
Run Code Online (Sandbox Code Playgroud)
而我Id.class,用于存储ID:
public class Id {
private String $oid;
public String get$oid() {
return $oid;
} …Run Code Online (Sandbox Code Playgroud)