我已经尝试了所有方法,但是解决方案非常丑陋,我真的想要一个直接的答案,是否可以改进(这意味着是否需要使用其他实现)。
问题在于带有GSON的Map of Maps:
根据Firebug给我以下回应:
{"id": 2, "result": {"FirstWorld": {"FirstValue": 5, ... }, "SecondWorld":{"FirstValue": 5, ....}}, "error":null }
大约有200个"Values"
,但是只有两个"Worlds"
。到目前为止,这是我在ControlService
课堂上要解析的内容:
public void RegisterValues( String [] Names, AsyncCallback<Map<String,RegisterValues>> callback);
public class RegisterValues
{
int FirstValue;
int SecondValue;
... And so on 200 times !!!
所以我这样访问数据:
service_.RegisterValues( Names, new AsyncCallback<ControlService.RegisterValues>()
{
public void onSuccess( GlibControlService.RegisterValues result )
{
String test = "FirstValue";
String message="Result for channel 1 is ";
for( String Name : result.keySet() ) message+=Name+"="+result.get(Name);
但是正如您所看到的,这将是很长的时间。另一个问题是某些“值”中包含“&”号,这意味着我不能在此方法中使用它们。
@SerializedName("One&Two") // Ampersand not allowed in name
int OneTwo; //gives Invalid JSON response apparently
有人有更好的方法吗?
*_起作用的 _ *编辑 代码:
private ControlService service_;
service_.connectedNames( new String[0], new AsyncCallback<String[]>() {
public void onSuccess( String[] result)
{
List_.removeItem(0);
Names = result;
for( String Name : result ) {
List_.addItem(Name);
}
List_.setEnabled( true );
}
public void onFailure(Throwable why)
{
List_.removeItem(0);
List_.addItem( "Server error!" );
}
});
然后在我的ControlService类中,有以下内容:
@RpcImpl(version=RpcImpl.Version.V2_0,transport=RpcImpl.Transport.HTTP_POST)
public interface ControlService extends RemoteJsonService
{
public void connectedNames( String [] Names, AsyncCallback<String[]> callback );
这很完美。
我尝试通过在ControlService中添加以下内容来执行此操作:
public void RegisterValues( String [] Names, AsyncCallback<Map< String,Map<String, Integer>> callback);
依此类推,Map<String, Map<String, Integer>>
还要确保也位于onSucess()
结构的一部分中。但是,这导致我的程序崩溃。在我看来,它不喜欢嵌套地图。但是,如果成员名称与JSON字段匹配,则GSON将自动在对象中进行解析。所以我用它RegisterValues
来自动强制GSON解析它。
堆栈跟踪:
[ERROR] Errors in 'generated://AF9BA58B045D92E7896CD657C9CC5FAF/example/client/ControlService_JsonProxy.java'
[ERROR] Line 18: INSTANCE cannot be resolved or is not a field
See snapshot: /var/folders/pf/56b3mznn35gg741rlsqq424m0000gp/T/example.client.ControlService_JsonProxy2948240672238331252.java
这就是为什么我认为GSON无法使用AsyncCallback自动解析嵌套地图的原因。最好按照下面的建议进行HTTP调用。
最好的方法是将您发布的响应包装到一个类中。
{"id": 2, "result": {"FirstWorld": {"FirstValue": 5, ... }, "SecondWorld":{"FirstValue": 5, ....}}, "error":null }
import java.util.Map;
public class Response {
private int id;
private Map<String, Map<String, Integer>> result;
private String error;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Map<String, Map<String, Integer>> getResult() {
return result;
}
public void setResult(Map<String, Map<String, Integer>> result) {
this.result = result;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
}
我已经对此进行了测试,并且运行良好。
static String json = "{\"id\":2,\"result\":{\"FirstWorld\":{\"FirstValue\":5,\"SecondValue\":6},\"SecondWorld\":{\"FirstValue\":5,\"SecondValue\":6}},\"error\":null}";
public static void main(String[] args) {
Gson g= new Gson();
Response b=g.fromJson(json, Response.class );
System.out.println(g.toJson(b));
}
如果您需要RegisterValues
声明该类,则只需要Map<String, Integer>
用此类替换result,可能是extended
Map
。
我正在使用凌空OkHttp从服务器获取一些数据。 响应是一个包含JSON的字符串,我想使用GSON/POJO解析它。 我得到错误: 预期BEGIN_OBJECT,但在第1行第1列路径$上是STRING 尝试解析时。 原因:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第1列路径$ com.google.gson.stream.JsonRead
问题内容: 我正在尝试从上述JSON检索邮政编码。我正在用gson解析它。我是JSON的新手,从我在这里的所有文章中读到的内容(有些与此类似),我都知道字段名称应保持原样。所以我知道我必须做出4类,即响应,视图,结果和地址。我使它们成为静态嵌套类,但是我只得到空值作为输出。在下一个JSON中,我有多个地址。但是我只停留在这个单一的回应上。 举一个简短的例子,我尝试使用此代码检索Timestamp,
我想做的是使用Gson将嵌套的json数据解析为Java对象,并使用自定义的toString()将其打印出来。 Json内容 POJO类:示例 POJO类:JsonFormatter 我的POJO还有其他类,我试图将其解析为Gson的方式是: 但是当我试图打印出它的子值时,比如 我得到了错误: 我想实现的是将上面的json内容打印成这样: 谁能帮我解决这个问题吗?提前谢谢!
问题内容: 我想使用 GSON* 在 JAVA中 解析此 JSON 文件: *** 但是我不知道如何加入root元素: 描述符 ,之后是 app3 元素,最后是 name 元素。 我遵循了本教程http://www.mkyong.com/java/gson-streaming-to-read-and-write- json/ ,但是它没有显示具有root和childs元素的情况。 问题答案: Im
问题内容: 我有一个像这样的JSON文件: 在文件具有根元素之前,我将使用: 代码,但我不认为如何将类编码为根元素是一个数组。 我试过使用: 与: 但是还没有运气。使用这种方法我还能怎么读呢? PS我有这个工作使用: 但是我更想知道如何使用这两种方法(如果可能)。 问题答案: 问题是由放置在数组中的JSON对象(在 每种 情况下)的末尾逗号引起的: 如果删除它们,您的数据将成为 和 应该工作正常。