【问题标题】:Parse Json to Java将 Json 解析为 Java
【发布时间】:2012-04-18 03:10:21
【问题描述】:

我想解析这个 Json 代码:

[{"id":7,"key":"integrationContinue:integrationContinue","name":"life Portlet","scope":"PRJ","qualifier":"TRK","date":"2012-03-26T10:10:22+0100","lname":"life Portlet","lang":"java","version":"1.0-SNAPSHOT","description":"","msr":[{"key":"ncloc","val":897.0,"frmt_val":"897"},{"key":"coverage","val":0.6,"frmt_val":"0,6%"}]}]

我创建了两个类:

 public class Ressources {

  private String id;
    private String key;
    private String name;
    private String lname;
    private String scope;
    private String qualifier;
    private String lang;
    private String version;
    private String date;
    private List<Mesures> msr;


    public Ressources() {

    }

    public Ressources(String id, String key, String name, String lname,
            String scope, String qualifier, String lang, String version,
            String date, List<Mesures> msr) {
        super();
        this.id = id;
        this.key = key;
        this.name = name;
        this.lname = lname;
        this.scope = scope;
        this.qualifier = qualifier;
        this.lang = lang;
        this.version = version;
        this.date = date;
        this.msr = msr;
    }
 @Override
 public String toString() {return "Ressources : \n id=" + id  + ",\n key=" + key + ",\n name=" + name + ",\n lname=" + lname + ",\n scope=" + scope + ",\n qualifier=" + qualifier + ",\n lang=" + lang + ",\n version=" + version + ",\n date=" + date;

}

 public class Ressources {

  private String id;
    private String key;
    private String name;
    private String lname;
    private String scope;
    private String qualifier;
    private String lang;
    private String version;
    private String date;
    private List<Mesures> msr;


    public Ressources() {

    }

    public Ressources(String id, String key, String name, String lname,
            String scope, String qualifier, String lang, String version,
            String date, List<Mesures> msr) {
        super();
        this.id = id;
        this.key = key;
        this.name = name;
        this.lname = lname;
        this.scope = scope;
        this.qualifier = qualifier;
        this.lang = lang;
        this.version = version;
        this.date = date;
        this.msr = msr;
    }
 @Override
 public String toString() {return "Ressources : \n id=" + id  + ",\n key=" + key + ",\n name=" + name + ",\n lname=" + lname + ",\n scope=" + scope + ",\n qualifier=" + qualifier + ",\n lang=" + lang + ",\n version=" + version + ",\n date=" + date;}

(使用 getter 和 setter)

public class Mesures {


private String key;
private float val;
private String frmt_val;

public Mesures(){}
public Mesures(String akey, float aval,String afrmt_val ){
    key=akey;
    val=aval;
    frmt_val=afrmt_val;

}

 @Override
 public String toString() {return " \n key=" + key  + ",\n val=" + val + ",\n frmt_val=" + frmt_val;
}

然后我创建了两个函数:

 public List<Ressources> parseGson_Ressources(String jsonToParse) {

        JsonElement jsonElement = new JsonParser().parse(jsonToParse);
        JsonArray array = jsonElement.getAsJsonArray();

        @SuppressWarnings("rawtypes")
        Iterator iterator = array.iterator();
        List<Ressources> ressources = new ArrayList<Ressources>();

        while (iterator.hasNext()) {
            JsonElement jsontmp = (JsonElement) iterator.next();
            Gson gson = new Gson();
            Ressources ressource1 = gson.fromJson(jsontmp, Ressources.class);        
            ressources.add(ressource1);

        }

        return ressources;
    }

 public List<Mesures> parseGson_Mesures(String jsonToParse) {

        JsonElement jsonElement = new JsonParser().parse(jsonToParse);
        JsonArray array = jsonElement.getAsJsonArray();

        @SuppressWarnings("rawtypes")
        Iterator iterator = array.iterator();
        List<Mesures> mesures = new ArrayList<Mesures>();

        while (iterator.hasNext()) {
            JsonElement jsontmp = (JsonElement) iterator.next();
            Gson gson = new Gson();
            Mesures mesure = gson.fromJson(jsontmp, Mesures.class);
            mesures.add(mesure);
        }   
        return mesures;
    }

然后我写了这段代码来得到结果:

 String xxx = RequestSonar(); //wich return the Json result

     List<Ressources> listRessources = new ArrayList<Ressources>();
     listRessources = rs.parseGson_Ressources(xxx);
     Iterator<Ressources> iterator;
     iterator = listRessources.iterator();

     while (iterator.hasNext()) {

         Ressources ressource = iterator.next();
         System.out.println(ressource.toString());
     }
     List<Mesures> listMesures = new ArrayList<Mesures>();
     Iterator<Mesures> iterator2;
     listMesures = rs.parseGson_Mesures(xxx);
     iterator2 = listMesures.iterator();

     while (iterator2.hasNext()) {

        Mesures mesure = iterator2.next();
        System.out.println(mesure.toString());
    }

执行后我得到这个结果:

Ressources : 
id=7,
key=integrationContinue:integrationContinue,
name=life Portlet,
lname=life Portlet,
scope=PRJ,
qualifier=TRK,
lang=java,
version=1.0-SNAPSHOT,
date=2012-03-26T10:10:22+0100

key=integrationContinue:integrationContinue,
val=0.0,
frmt_val=null

我该如何解决这个问题?

【问题讨论】:

  • 你自己写过java解析JSON的代码吗?
  • 哇,有很多东西要看。尝试使用 GSON,您只需要两个 ValueObject 类就足够了。除非轮子坏了,否则不要重新发明轮子
  • 我认为他已经在使用 GSon。
  • 我觉得有一个库可以让你的工作更轻松,而且错误更少。看看这个问题:stackoverflow.com/questions/338586/a-better-java-json-library
  • 他已经在使用Gson了!唯一的问题是他没有正确反序列化 List/Collection 并且他使用了一种被窃听的混合技术。正确使用带有 List/Collections 的 Gson 将解决他的问题

标签: java json list parsing sonarqube


【解决方案1】:

如果这个 JSON 是从 Sonar Web 服务调用的结果,那么您不需要解析它:只需使用 Sonar Java Web Service Client 组件,这将为您完成所有工作,您不需要完全关心 JSON => http://docs.codehaus.org/display/SONAR/Using+the+Web+Service+Java+client

【讨论】:

  • 我试过了,但是当我执行时我得到这个错误“java.lang.NoClassDefFoundError: org/json/simple/JSONValue”
  • 我试过这个Resource struts = sonar.find(ResourceQuery.createForMetrics("integrationContinue:integrationContinue", "coverage", "lines", "violations")); Measure s=struts.getMeasure("coverage"); System.out.println(s.getData());
  • 您是否使用 Maven 构建您的项目?如果没有,那么您应该:它将为您设置所有必需的依赖项,以便使用 Java Web Service Client 组件。而且我坚持:我们已经开发了这个 Java 客户端,因此您不需要重新创建所有 JSON 解析内容。一旦你的类路径正确,你上面写的代码就会做你需要的一切,就这么简单!
  • 我正在使用 Maven 我添加了这个依赖项:org.codehaus.sonarsonar-ws-client2.12 但我的 pom 混乱了,我不知道如何修复它。有我的 pom toofiles.com/fr/oip/documents/xml/pom.html 你能帮忙知道我应该放置哪些依赖项。我正在与 maven、vaadin、liferay 合作
  • 删除所有其他 JSON 依赖项,您不需要它们。如果您遵循文档 (docs.codehaus.org/display/SONAR/…),您会发现您不需要很多依赖项(在页面的开头)。
【解决方案2】:
i think this will help you,

create two classes with getter setter methods

public class Ressources {

    private String id;
    private String key;
    private String name;
    private String lname;
    private String scope;
    private String qualifier;
    private String lang;
    private String version;
    private String date;
    private List<Mesures> msr;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String lname) {
        this.lname = lname;
    }

    public String getScope() {
        return scope;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

    public String getQualifier() {
        return qualifier;
    }

    public void setQualifier(String qualifier) {
        this.qualifier = qualifier;
    }

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public List<Mesures> getMsr() {
        return msr;
    }

    public void setMsr(List<Mesures> msr) {
        this.msr = msr;
    }

}

public class Mesures {

    private String key;
    private float val;
    private String frmt_val;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public float getVal() {
        return val;
    }

    public void setVal(float val) {
        this.val = val;
    }

    public String getFrmt_val() {
        return frmt_val;
    }

    public void setFrmt_val(String frmt_val) {
        this.frmt_val = frmt_val;
    }

}

then use this to Parse your JSON

String jsonl = "[{'id':7,'key':'integrationContinue:integrationContinue','name':'life Portlet','scope':'PRJ','qualifier':'TRK','date':'2012-03-26T10:10:22+0100','lname':'life Portlet','lang':'java','version':'1.0-SNAPSHOT','description':'','msr':[{'key':'ncloc','val':897.0,'frmt_val':'897'},{'key':'coverage','val':0.6,'frmt_val':'0,6%'}]}]";

Gson gson = new Gson();
Type collectionType = new TypeToken<List<Ressources>>() {
        }.getType();
List<Ressources> ressourcesList = gson.fromJson(jsonl, collectionType);

Ressources ressources = ressourcesList.get(0);
System.out.println("id :" + ressources.getId());
System.out.println("key :" + ressources.getKey());
System.out.println("name :" + ressources.getName());
System.out.println("scope :" + ressources.getScope());
System.out.println("qualifier :" + ressources.getQualifier());
System.out.println("date :" + ressources.getDate());
System.out.println("lname :" + ressources.getLname());
System.out.println("lang :" + ressources.getLang());
System.out.println("version :" + ressources.getVersion());
System.out.println("Mrs :");

List<Mesures> mrsList = ressources.getMsr();
for (int i = 0; i < mrsList.size(); i++) {
System.out.println("key :" + mrsList.get(i).getKey());
System.out.println("val :" + mrsList.get(i).getVal());
System.out.println("frmt_val :" + mrsList.get(i).getFrmt_val());
}


output:

id :7
key :integrationContinue:integrationContinue
name :life Portlet
scope :PRJ
qualifier :TRK
date :2012-03-26T10:10:22+0100
lname :life Portlet
lang :java
version :1.0-SNAPSHOT
Mrs :
key :ncloc
val :897.0
frmt_val :897
key :coverage
val :0.6
frmt_val :0,6%

【讨论】:

    【解决方案3】:

    你可以写:

    public Ressources[] parseGson_Ressources(String jsonToParse) {
        Gson gson = new Gson();
        Ressources[] resources = gson.fromJson(jsonToParse, Ressources[].class);
    }
    

    这应该完成您的两个复杂方法parseGson_RessourcesparseGson_Ressources 的所有工作。

    编辑 根据 Guillaume Polet 的评论,我的初始代码不正确。我将方法的返回类型更改为数组,因为这更易于实现。不过,如果您想坚持 List 解决方案,请考虑他的评论 - 它应该会有所帮助。

    【讨论】:

    • 如果我错了,请纠正我,但 List&lt;Ressources&gt;.class 实际上在 Java 中无效。但他可以将这个替代方案与 GSon 一起使用:Type collectionType = new TypeToken&lt;List&lt;Ressources&gt;&gt;(){}.getType(); 并传递 collectionType 而不是类。
    【解决方案4】:

    我不想打破你的泡沫......但我会去:

    new Gson().fromJson(<json string here>, MyClass.class)
    

    MyClass 将是您从中生成 JSon 的类。 GSon 是一个谷歌图书馆。如果你使用maven,你可以按如下方式包含它:

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>1.7.1</version>
    </dependency>
    

    就是这么简单……转成JSon,就用toJson()方法就行了。

    【讨论】:

    • 他在做什么。顺便说一句,GSon 现在是 2.1 版。他唯一的问题是,他没有使用 List/Collection 反序列化/序列化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多