5

私はいくつかのオブジェクトクラスオブジェクトのjson文字列表現を持っています

public class SMPBBaseObjectsList {

    public ArrayList<Object> data = new ArrayList<>();
    public Integer count;
    public Integer limitFrom;
    public Integer limitTo;
    public Boolean hasMore;
    public String dataItemsClass;
}

そして、私はjsonを持っています

{"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013","data":[{"id":1374046117510970000," Name":"Test3","classItem":"smpb.base.classes.SMPBUser","dataSliceCode":"012013"}],"filter":{"orderItems":[],"filterItems":[]} }

このjsonを解析して、次のコードでクラスのオブジェクトを作成してみます:

 String json = "{\"classItem\":\"smpb.utility.classes.SMPBBaseObjectsList\",\"dataItemsClass\":\"smpb.base.classes.SMPBUser\",\"dataSliceCode\":\"012013\",\"data\":[{\"id\":1374046117510970000,\"Name\":\"Test3\",\"classItem\":\"smpb.base.classes.SMPBUser\",\"dataSliceCode\":\"012013\"}],\"filter\":{\"orderItems\":[],\"filterItems\":[]}}";
        SMPBBaseObjectsList list = new GsonBuilder().create().fromJson(json, SMPBBaseObjectsList.class);
        System.out.println("BEFORE:" + json);
        System.out.println("AFTER: " + list);

システム出力:

前: {"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013","data":[{ "id":1374044905885298000 ,"Name":"Test3","classItem":"smpb.base.classes.SMPBUser","dataSliceCode":"012013"}],"filter":{"orderItems":[],"filterItems":[ ]}}

AFTER: {"classItem":"smpb.utility.classes.SMPBBaseObjectsList","dataItemsClass":"smpb.base.classes.SMPBUser","dataSliceCode":"012013","data":[{"名前":" Test3"、"id":1.374044905885298011E18、"classItem":"smpb.base.classes.SMPBUser"、"dataSliceCode":"012013"}]、"filter":{"orderItems":[]、"filterItems": []}}

Json String でわかるように、値が 1374044905885298000 の ID がありますが、オブジェクトを文字列からシリアル化すると、1.374044905885298011E18 が得られます

問題は、Long のこの表現が最後のゼロ 0000 を失い、Long 1374044905885297920 を得たことです。

なんで?そして、どのように修正しますか?

Array のデータは String マップで、すでにすべて Long id Double 形式です。

Long または Double の registerAdapter を試してみましたが、トリガーされませんでした。

Gson 2.2.4 のバージョン

アップデート

質問の重複ではありません

Gson が長い数値 (json 文字列) を科学表記形式に変換しないようにするにはどうすればよいですか?

4

1 に答える 1

0

何が問題なのか正確にはわかりませんが、別のクラスを作成することで解決できます。つまり、クラスの代わりにDataを使用します...このコードを試してみたところ、問題なく動作しています!ListObject

したがって、次のように置き換える必要がありArrayList<Object>ますSMPBBaseObjectsList

public ArrayList<Data> data = new ArrayList<>()

そして、次のような新しいクラスを作成します。

public class Data {    
    public Long id;
    public String Name;
    public String classItem;
    public String dataSliceCode;
}

JSON をオブジェクトに解析するときに問題があると思いObjectます。おそらく、その数値の書式設定につながる何らかの変換が行われますが、残念ながら、私はこの Java の低レベルの問題の専門家ではありません...
とにかく、このコードであなたはその値を に解析することを明示的に指定するLongので、問題はありません!

于 2013-07-17T14:08:03.667 に答える