Json格式错误显示

时间:2017-02-08 20:43:19

标签: java json formatting

我正在尝试以下列格式显示JSon文件。但是当我运行我的程序时,它会显示底部的顶部。为什么是这样?我这样做是否正确?请在代码下方找到输出和预期输出的图片。

代码:

public class Student {

    public static void main(String[] args) {

        int a = -7;
        int b = 7;
        int k = 103;
        int order = 109;
        int px = 60;
        int py = 76;
        int qx = 101;
        int qy = 42;
        int n = 3;
        int rx = 2;
        int ry = 102;
        int sx = 64;
        int sy = 17;

         JSONObject obj = new JSONObject();
         obj.put("name", "JEAN-LUC PALMYRE");
         obj.put("srn", "120299364");


        JSONObject objEcc = new JSONObject();
         objEcc.put("a",a);
         objEcc.put("b",b);
         objEcc.put("k",k);
         objEcc.put("order",order);

         obj.put("ecc", objEcc);

         JSONObject objModk_add = new JSONObject();
         objModk_add.put("x", px);
         objModk_add.put("y", py);

         obj.put("p", objModk_add);

         objModk_add.put("x", qx);
         objModk_add.put("y", qy);

         obj.put("q", objModk_add); 

         objModk_add.put("x", rx);
         objModk_add.put("y", ry);

         obj.put("r", objModk_add); 

         JSONObject objModk_mul = new JSONObject();
         objModk_mul.put("x", px);
         objModk_mul.put("y", py);

         obj.put("p", objModk_mul);


        try (FileWriter file = new FileWriter("Jean-LucPalmyre_120299364_CO3326_cw1.json")) 
        {

            file.write(obj.toJSONString());
            file.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.print(obj);

    }
}

输出:

Output

预期产出:

Expected output

4 个答案:

答案 0 :(得分:1)

我认为它与JSONObject实际上使用Map进行表示这一事实有关,并且不能保证Map中值的顺序保留。

答案 1 :(得分:0)

作为一种变通方法,您可以向Student类添加一个方法,以JSON格式打印或返回它的属性。

这样的事情:

public class Student {

 private String name;
 private String srn;
 private Ecc ecc;
 ...

 public Student(String name, String srn, Ecc ecc ...) {
   this.name = name;
   this.srn = srn;
   this.ecc = ecc;
   ....
 }

 @Override
 public String toString() {
     JSONObject jsonName = new JSONObject();
     obj.put("name", name);
     JSONObject jsonSrn = new JSONObject();
     obj.put("srn", srn);
     ...

    "{" + 
     jsonName.toJSONString() +
     "," +
     jsonSrn.toJSONString() +
     ... // do the sane with the rest of the properties
     +
     "}"     
 }
}

然后,您可以像这样打印。

try (FileWriter file = new FileWriter("JeanLucPalmyre_120299364_CO3326_cw1.json")) 
    {
        file.write(new Student("MARK", "000001", new Ecc()...));
        file.flush();

    } catch (IOException e) {
        e.printStackTrace();
    }

答案 2 :(得分:0)

Pacane是对的。如果您使用例如LinkedHashMap,它将起作用。

例如,这可行......

private class OwnJsonObj extends JSONObject {
        OwnJsonObj() {
            super(new LinkedHashMap());
        }
    }

您可以使用此嵌套类而不是JSONObject,它会保留顺序。 如果你在其他地方使用这个物体,我不推荐它,它会弄得一团糟。

答案 3 :(得分:0)

Pacane是对的,地图不会按照添加的顺序存储对象,而JSON对象在java中存储为地图。我可以建议使用数组而不是地图:put method in the json object adds value to the first of the jsonobject;