JSON formatting for a Java Server

后端 未结 3 834
自闭症患者
自闭症患者 2021-01-26 23:55

I am trying to read JSON string using gson into a Java program. In the sample code below - the Java program has 3 object classes. The data in the json string will have a vari

相关标签:
3条回答
  • 2021-01-27 00:30

    First of all you have to decide what is your base json structure ? Max identifiers, max values, max objects,max arrays...

    1. Create your full json structure with texteditor or http://www.jsoneditoronline.org/ or http://jsonlint.com/ etc.

    Let's think this is my full json structure:

    {
      "array": [
        1,
        2,
        3
      ],
      "boolean": true,
      "null": null,
      "number": 123,
      "object": {
        "a": "b",
        "c": "d",
        "e": "f"
      },
      "string": "Hello World"
    }
    
    1. Create your Java Classes as like as your json identifiers. You can use http://json2csharp.com/ convert to Java.

    And these are my Java Classes:

    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. Create your DAO for convert these to structure to them.

    For Java;

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

    For Json;

    Gson gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();
    String json = gson.toJson(obj);
    
    0 讨论(0)
  • 2021-01-27 00:32

    Your JSON-string seems incorrect to me. Let me propose the following:

    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();
            }
        }
    }
    

    Assuming a "table definition" consists of a property named as the class ob the objects in the table, with the objects as array value of that property.

    Explanation of Class.forName("[Lnewpackage." + tableName + ";")

    This retrieves the Class instance for the array type of a class located in the package newpackage, e.g. newpackage.TableA[] (note the []). Class.forName("A") returns the instance representing the class A. Class.forName("[LA;") returns the instance representing the "class" of an array of As. Using it as a parameter for fromJson(...) it results in the parsing of a JSON array of A-objects.

    0 讨论(0)
  • 2021-01-27 00:34

    This is the code - that works based on @hurricane suggestion.

    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; 
    
    }
    
    }
    

    The output for the above is:

    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
    
    0 讨论(0)
提交回复
热议问题