gpt4 book ai didi

java - 使用 GSON 解析 JSON,类问题

转载 作者:行者123 更新时间:2023-12-02 07:40:11 25 4
gpt4 key购买 nike

我在使用 GSON 解析 JSON 时遇到问题。

JSON:

{ "data" : [ { "agent" : "Something",
"browser" : "app_j2me",
"campaign" : [ { "banner_type" : "mweb",
"campaign_type" : "cpc",
"cid" : "3",
"contentid" : "49fee4",
"ecpm" : "0.0804"
},
{ "banner_type" : "mweb",
"campaign_type" : "cpc",
"cid" : "22",
"contentid" : "1234",
"ecpm" : "0.1"
}
],
"cntr" : "th",
"imgsize" : "216x36",
"ip" : "123.123.123.123",
"partnerid" : 8959,
"url_click" : "...",
"url_img" : "...",
"url_show" : "...",
"version" : "2"
} ],
"error" : null
}

Java部分:

Gson gson = new Gson();
Json j = gson.fromJson(res, Json.class);
System.out.println(j);

类(class):

class Json {

public Data d;
public Error r;

public String toString() {
return "Json [url_click=" + d.url_click
+ ", url_img=" + d.url_img
+ ", url_show=" + d.url_show
+ ", imgsize=" + d.imgsize
+ ", cntr=" + d.cntr
+ ", ip=" + d.ip
+ ", version=" + d.version + "]";
}
}

class Data {

public static String url_click;
public String url_img;
public String url_show;
public String imgsize;
public String cntr;
public String ip;
public String version;
public String browser;
public String agent;
public List<Campaign> campaign;

public String toString() {
return "Data [url_click=" + url_click
+ ", url_img=" + url_img
+ ", url_show=" + url_show
+ ", imgsize=" + imgsize
+ ", cntr=" + cntr
+ ", ip=" + ip
+ ", version=" + version + "]";
}
}

class Campaign {

public String banner_type;
public String campaign_type;
public String cid;
public String contentid;
public String ecpm;
}

class Error {

public String error;
}

运行此代码的结果:

Json [url_click=null, url_img=null, url_show=null, imgsize=null, cntr=null, ip=null, version=null]

我认为这是类的问题,但现在考虑如何使其正常工作。 GSON 版本为 2.2.2,Java 1.6。

最佳答案

如原始问题中所示,代码会导致 NullPointerException。除此之外...

原问题中当前的反序列化代码存在两个基本问题:

首先,JSON 元素名称与 Java 字段名称不匹配,因此 Gson 无法在反序列化期间自动进行数据绑定(bind),无需额外的配置信息——将 JSON 元素映射到 Java 字段。如果 Java 字段名称与 JSON 元素名称完全匹配,则无需进行此类额外配置。下面的示例使用 @SerializedName 注释来提供缺少的名称映射。

其次,JSON数据结构与Java数据结构并不完全(足够)匹配。 JSON 包含一组“数据”对象,而 Java 数据结构只需要一个“数据”对象。纠正此问题的一个简单方法是更改​​ Java 结构以匹配 JSON,并期望“数据”对象的集合(列表或数组),如下例所示。 (或者,可以使用简单的自定义反序列化处理将(一个组件的)JSON 集合绑定(bind)到不是集合的 Java 字段。)

import java.io.FileReader;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

public class GsonFoo
{
public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
Json j = gson.fromJson(new FileReader("input.json"), Json.class);
System.out.println(gson.toJson(j));
}
}

class Json
{
@SerializedName("data")
public List<Data> d;

@SerializedName("error")
public Error r;
}

class Data
{
public static String url_click;
public String url_img;
public String url_show;
public String imgsize;
public String cntr;
public String ip;
public String version;
public String browser;
public String agent;
public List<Campaign> campaign;
}

class Campaign
{
public String banner_type;
public String campaign_type;
public String cid;
public String contentid;
public String ecpm;
}

class Error
{
public String error;
}

另请注意,将静态 Java 成员映射到 JSON 对象集合中的字段至少是概念/语义不匹配。这还不是最糟糕的事情。只要确保人们理解它的含义即可。

关于java - 使用 GSON 解析 JSON,类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11714256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com