【问题标题】:Create class from json with Gson使用 Gson 从 json 创建类
【发布时间】:2016-12-05 10:52:45
【问题描述】:

我正在使用:

Gson gson = new Gson();
return gson.fromJson(jsonstr,cls);

jsonstr 在哪里:

{"title": "ttl","data": "dta"}

而 cls 是:

public class GSONTest {

public String title;
public String data;

public String getTitle() {
    return title;
}

public String getData() {
    return data;
}

}

但我会做一些更复杂的事情,这是我的 json 示例:

{
  "Some1": {
    "data": "dta",
    "title": "ttl"
  },
  "Some3": {
    "data": "dta2",
    "title": "ttl2"
  }
}

对于这种类型的 json,我的班级应该是什么样子?

【问题讨论】:

标签: android json gson


【解决方案1】:
    Type type = new TypeToken<Map<String, GSONTest>>(){}.getType();
    Map<String, GSONTest> gsonTestMap = gson.fromJson(jsonstr, type);

【讨论】:

    【解决方案2】:

    正如您所见,每个 JSON 对象都类似于 java 中的一个类,因此您应该为 JSON 的根创建一个 Java 类,如下所示:

    public class GSONTest {
    
        GSONTest2 element1;
        GSONTest2 element2;
    
        //constructor, getters and setters here
    
    }
    

    你看到我使用了另一个对象,所以它可以存储你的 JSON 的“level2”这个类将是这样的:

    public class GSONTest2{
        String element1; //This will stored "dta and dta2"
        String element2; //This will stored "ttl1 and ttl2"
        //constructor, getters and setters here 
    

    }

    因此,当您调用 GSON 时,您应该这样做:

    Gson gson = new Gson();
    return gson.fromJson(jsonstr,GSONTest.class);
    

    【讨论】:

      【解决方案3】:


      示例 {

       @SerializedName("Some1")
       @Expose
       private Some1 some1;
       @SerializedName("Some3")
       @Expose
       private Some3 some3;
      
      
       public Some1 getSome1() {
        return some1;
       }
      
       public void setSome1(Some1 some1) {
        this.some1 = some1;
       }
      
      
       public Some3 getSome3() {
        return some3;
       }
      
      
       public void setSome3(Some3 some3) {
        this.some3 = some3;
       }
      
      }
      

      ------------------------com.example.Some1.java----- ------------

       import com.google.gson.annotations.Expose;
       import com.google.gson.annotations.SerializedName;
      
       public class Some1 {
      
        @SerializedName("data")
        @Expose
        private String data;
        @SerializedName("title")
        @Expose
        private String title;
      
       public String getData() {
         return data;
       }
      
      
       public void setData(String data) {
        this.data = data;
       }
      
      
       public String getTitle() {
         return title;
       }
      
      
       public void setTitle(String title) {
         this.title = title;
       }
      
      }
      

      ------------------------com.example.Some3.java----- ------------

      import com.google.gson.annotations.Expose;
      import com.google.gson.annotations.SerializedName;
      
      public class Some3 {
      
      @SerializedName("data")
      @Expose
      private String data;
      @SerializedName("title")
      @Expose
      private String title; 
      
      public String getData() {
      return data;
      }
      
      
      public void setData(String data) {
       this.data = data;
      }
      
      
      public String getTitle() {
       return title;
      }
      
      
      public void setTitle(String title) {
       this.title = title;
      }
      
      } 
      

      这是给你的活动代码,ENJOY!!!

       public class MainActivity extends AppCompatActivity {
      
       String json = "{\n" +
              "  \"Some1\": {\n" +
              "    \"data\": \"dta\",\n" +
              "    \"title\": \"ttl\"\n" +
              "  },\n" +
              "  \"Some3\": {\n" +
              "    \"data\": \"dta2\",\n" +
              "    \"title\": \"ttl2\"\n" +
              "  }\n" +
              "}";
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          Example mExample = new Gson().fromJson(json, Example.class);
      
          Toast.makeText(this, mExample.toString(), Toast.LENGTH_SHORT).show();
      }
      }
      

      您也可以使用本网站生成类link

      【讨论】:

      • 如果您自己不知道答案,请不要投反对票,这是可行的解决方案。
      • 不,不是。 OP 已经有了解析内部 json 的 pojo。
      • 在思考这个 {"title":"ttl","data":"dta"} 的类之前,请查看我编辑的答案,也需要发布 JAVA 代码以获得进一步的指导。
      • 还是错了,Op有一个json变量键名。
      • 如果有 1000 个名为 Some0...Some1000 的条目怎么办?你会创建 1000 个不同的 pojo 吗?
      【解决方案4】:

      你的课是这样的

      package com.example;
      
      import com.google.gson.annotations.Expose;
      import com.google.gson.annotations.SerializedName;
      
      public class Example {
      
      @SerializedName("Some1")
      @Expose
      private Some1 some1;
      @SerializedName("Some3")
      @Expose
      private Some3 some3;
      
      
      public Some1 getSome1() {
      return some1;
      }
      
      public void setSome1(Some1 some1) {
      this.some1 = some1;
      }
      
      public Some3 getSome3() {
      return some3;
      }
      
      public void setSome3(Some3 some3) {
      this.some3 = some3;
      }}
      

      下一个 Some1.class

      package com.example;
      
      import com.google.gson.annotations.Expose;
      import com.google.gson.annotations.SerializedName;
      
      public class Some1 {
      
      @SerializedName("data")
      @Expose
      private String data;
      @SerializedName("title")
      @Expose
      private String title;
      
      
      public String getData() {
      return data;
      }
      
      public void setData(String data) {
      this.data = data;
      }
      
      
      public String getTitle() {
      return title;
      }
      
      
      public void setTitle(String title) {
      this.title = title;
      }
      
      }
      

      下一个 Some3.class

      package com.example;
      
      import com.google.gson.annotations.Expose;
      import com.google.gson.annotations.SerializedName;
      
      public class Some3 {
      
      @SerializedName("data")
      @Expose
      private String data;
      @SerializedName("title")
      @Expose
      private String title;
      
      /**
      * 
      * @return
      * The data
      */
      public String getData() {
      return data;
      }
      
      /**
      * 
      * @param data
      * The data
      */
      public void setData(String data) {
      this.data = data;
      }
      
      /**
      * 
      * @return
      * The title
      */
      public String getTitle() {
      return title;
      }
      
      /**
      * 
      * @param title
      * The title
      */
      public void setTitle(String title) {
      this.title = title;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 2023-03-06
        • 2019-04-29
        相关资源
        最近更新 更多