Java Server的JSON格式

时间:2015-09-01 12:12:16

标签: java json

我正在尝试使用gson将JSON字符串读入Java程序。在下面的示例代码中 - Java程序有3个对象类。 json字符串中的数据将具有每个类的可变数量的对象实例。我试图创建一个示例JSON - 解析..但解析各种对象时遇到问题。

这是使用json字符串的正确方法还是可以以不同的方式完成..如何使用不同类的变量对象解析json。谢谢,

package newpackage;
import java.util.ArrayList;

import com.google.gson.Gson;

public class jsonsample {



public static void main(String[] args) {

    String jsonstring = "{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}"
            + ",{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']},"
            + "{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}]"
            + ",{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
            + "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}]}";
    jsonstring = jsonstring.replace('\'', '"');



}

public class TableA {
    String field_A1;

    public TableA(String a){
        this.field_A1 = a;
    }

    @Override
    public String toString() {
        return ("Table A" + " " + this.field_A1);
    }

}

public class TableB {
    String field_B1;
    String field_B2;
    ArrayList<String> field_B3 = new ArrayList<String>();

    public TableB(String a, String b, ArrayList<String> c){
        this.field_B1 = a;
        this.field_B2 = b;
        this.field_B3 = c;
    }

    @Override
    public String toString() {
        return ("Table B" + " " + this.field_B1+ " " + this.field_B2);
    }

}

public class TableC {
    String field_C1;
    String field_C2;
    String field_C3;

    public TableC(String a, String b, String c){
        this.field_C1 = a;
        this.field_C2 = b;
        this.field_C3 = c;
    }

    @Override
    public String toString() {
        return ("Table C" + " " + this.field_C1 + " " + this.field_C2 + " " + this.field_C3);
    }

}

}

3 个答案:

答案 0 :(得分:1)

您的JSON字符串对我来说似乎不对。让我提出以下建议:

public static void main(String args[]) {
    String jsonstring = "["
        + "{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}"
        + ",{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']},"
        + "{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}]}"
        + ",{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
        + "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}]}"
        + "]";
    jsonstring = jsonstring.replace('\'', '"');

    Gson gson = new Gson();
    JsonParser parser = new JsonParser();
    JsonArray array = parser.parse(jsonstring).getAsJsonArray();

    for (JsonElement jsonElement : array) {
        JsonObject jsonObject = jsonElement.getAsJsonObject();
        Map.Entry<String,JsonElement> table = jsonObject.entrySet().iterator().next();
        String tableName = table.getKey();
        JsonElement rows = table.getValue();
        try {
            Class<?> rowClass = Class.forName("[Lnewpackage." + tableName + ";"); // explanation see below this code snippet
            // rowClass is an array class!
            Object[] parsedRows = gson.fromJson(rows, rowClass);
            // do something with parsedRows
            for (Object x : parsedRows) {
                System.out.println(x);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

假设“表定义”包含一个名为ob的属性ob表中的对象,对象作为该属性的数组值。

Class.forName的解释(“[Lnewpackage。”+ tableName +“;”)

这将检索位于包newpackage中的类的数组类型的Class实例,例如newpackage.TableA[](请注意[])。 Class.forName("A")返回表示类A的实例。 Class.forName("[LA;")返回表示A s数组的“类”的实例。使用它作为fromJson(...)的参数,它会导致解析A对象的JSON数组。

答案 1 :(得分:1)

首先,你必须决定你的基础json结构是什么?最大标识符,最大值,最大对象,最大数组......

  1. 使用texteditor或http://www.jsoneditoronline.org/http://jsonlint.com/等创建完整的json结构
  2. 让我们认为这是我完整的json结构:

    {
      "array": [
        1,
        2,
        3
      ],
      "boolean": true,
      "null": null,
      "number": 123,
      "object": {
        "a": "b",
        "c": "d",
        "e": "f"
      },
      "string": "Hello World"
    }
    
    1. 创建Java类,就像您的json标识符一样。您可以使用http://json2csharp.com/转换为Java。
    2. 这些是我的Java类:

      public class Object
      {
          public string a { get; set; }
          public string c { get; set; }
          public string e { get; set; }
      }
      
      public class RootObject
      {
          public ArrayList<int> array { get; set; }
          public Boolean boolean { get; set; }
          public Object @null { get; set; }
          public int number { get; set; }
          public Object @object { get; set; }
          public string @string { get; set; }
      }
      
      1. 创建您的DAO ,以便将这些转化为结构。
      2. 对于Java;

        String data = "jsonString"; 
        RootObject root = new GsonBuilder().create().fromJson(data, RootObject.class);
        

        对于Json;

        Gson gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
        String json = gson.toJson(obj);
        

答案 2 :(得分:0)

这是代码 - 基于@hurricane建议。

package newpackage;
import java.util.List;
import com.google.gson.*;
public class jsonsample {

public static void main(String[] args) throws ClassNotFoundException {

    String jsonstring = "{'TableA':["
            + "{'field_A1':'A_11'},"
            + "{'field_A1':'A_12'}"
            + "],"
            + "'TableB':["
            + "{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def']},"
            + "{'field_B1':'B_21','field_B2':'B_22','field_B3':['mno','xyz']}"
            + "],"
            + "'TableC':["
            + "{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
            + "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'}"
            + "]}";

    jsonstring = jsonstring.replace('\'', '"');

    RootObject root = new GsonBuilder().create().fromJson(jsonstring, RootObject.class);

    for (int i=0; i < root.TableA.size(); i++){
        System.out.println(root.TableA.get(i));
    }

    for (int i=0; i < root.TableB.size(); i++){
        System.out.println(root.TableB.get(i));
    }

    for (int i=0; i < root.TableC.size(); i++){
        System.out.println(root.TableC.get(i));
    }
}
public class TableA
{
    public String field_A1;

    @Override
    public String toString() {
        return ("Table A" + " " + this.field_A1);
    }
}
public class TableB{
    public String field_B1;
    public String field_B2;
    public List<String> field_B3;

    @Override
    public String toString() {
        return ("Table B" + " " + this.field_B1 + " " + this.field_B2 + " " +  this.field_B3);
    }
}
public class TableC{
    public String field_C1;
    public String field_C2;
    public String field_C3;

    @Override
    public String toString() {
        return ("Table C" + " " + this.field_C1 + " " + this.field_C2  + " " +  this.field_C3);
    }
}
public class RootObject{
    public List<TableA> TableA; 
    public List<TableB> TableB; 
    public List<TableC> TableC; 

}

}

以上的输出是:

Table A A_11
Table A A_12
Table B B_11 B_12 [abc, def]
Table B B_21 B_22 [mno, xyz]
Table C C_11 C_12 C_13
Table C C_21 C_22 C_23