我无法获得JSON和Java对象协同工作的要点。基本上我需要做的是检查URL上的JSON文件,看看是否有可用的软件的更新版本。我打开了连接,可以将JSON打印到控制台,但这就是我的运气。我一直在努力使用GSON。下面是我到目前为止的主要代码,清单是显示为更远的类的对象。我主要关注JSON中的“version”字段,因为我需要将它与我当前的程序版本号进行比较。
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
stringV = reader.readLine();
//System.out.println(manifest);
while ((line = reader.readLine()) != null) {
stringV = stringV + gson.toJson(line);
//manifest = manifest + line;
}
System.out.println(manifest);
manifest man = gson.fromJson(manifest, manifest.class);
testString = man.getversion();
System.out.println(test);
我的一个问题涉及我专门用于JSON的课程,我是否需要为JSON中的所有字段进行声明,获取/设置?
public class manifest{
private List<String> versions;
private String version;
private String current;
private String compatible;
private String published;
private String description;
private List<String> manifest;
private String jre;
public List<String> getVersions(){return versions;}
public String getversion(){return version;}
public String getcurrent(){return current;}
public String getcomp(){return compatible;}
public String getpub(){return published;}
public String getdesc(){return description;}
public List<String> getFileList(){return manifest;}
public String getjre(){return jre;}
public void setVersions(List<String> versions){this.versions = versions;}
public void setversion(String version){this.version = version;}
public void setcurrent(String current){this.current = current;}
public void setcomp(String compatible){this.compatible = compatible;}
public void setpub(String published){this.published = published;}
public void setdesc(String description){this.description = description;}
public void setFileList(List<String> manifest){this.manifest = manifest;}
public void setjre(String jre){this.jre = jre;}
@Override
public String toString(){
return String.format("Versions:%s,version:%s,curr:%s,comp:%s,pub:%s,desc:%s,manifest:%s,jre:%s",
versions, version, current, compatible, published, description, manifest, jre);
}
}
这是JSON的结构:
{
"versions": [
{
"version": "II V7.1.2",
"current": true,
"compatible": true,
"published": "2012-04-21T18:25:43-05:00",
"description": "Stability improvements for users:\n\n-Fix a crash\n-Fix a bug",
"manifest": [
{
"name": "file.jar",
"checksum": "56116165156111156156116161651161616116165116116516651651"
}, (more elements here)
"jre": "1.7.0_17"
非常感谢任何帮助,因为我根本不熟悉JSON。谢谢!
答案 0 :(得分:1)
JSON实际上很容易在对象世界中进行概念化。您可以将其视为数据映射,其中键是字符串,值可以是基本类型(布尔值,数字,字符串,日期),数组或其他映射中的任何一种。每当值最终成为另一个地图时,您就会创建一个对象!就这么简单。
因此,在您的情况下,让我们看看您包含的JSON代码段:
{
"versions": [
{
"version": "II V7.1.2",
"current": true,
"compatible": true,
"published": "2012-04-21T18:25:43-05:00",
"description": "Stability improvements for users:\n\n-Fix a crash\n-Fix a bug",
"manifest": [
{
"name": "file.jar",
"checksum": "56116165156111156156116161651161616116165116116516651651"
}
],
"jre": "1.7.0_17"
}
]
}
此代码段中的外部JSON对象包含单个JSON元素,该元素是一个名为versions
的数组。此数组中的每个元素都自然地映射到一个对象,为您提供如下顶级定义:
public class Root {
private List<Version> versions;
// Constructors, getters, setters
}
现在,您可以开始查看Version
对象的详细信息。使用这些规则来创建Java对象:
日期不是原始日期,但出于映射的目的,我们将应用相同的规则
public class Version {
private String version;
private Boolean current;
private Boolean compatible;
private Date published;
private String description;
private List<Manifest> manifest; // Note the collection *and* object mapping
private String jre;
// Constructors, getters, setters
}
public class Manifest {
private String name;
private String checksum;
}
非常简单吧?然后,您可以使用以下代码将顶级JSON映射到顶级对象:
Root obj = new Gson().fromJson(jsonStr, Root.class);
总的来说,用于检索JSON的代码有一些不必要/不正确的代码:
StringBuilder
来构建字符串,而不是使用更昂贵的concat操作gson.toJson(line);
的调用是不必要的,实际上是不正确的。