json.parseobject()的set方法设置顺序

json.parseobject()的set方法设置顺序,第1张

在开发过程中遇到一个问题:服务器经过排序返回后的字符串数据在使用fastjson解析后,数据顺序发生了变化,这个问题也就是:使用fastjson解析数据后导致顺序改变或者说是如何保持String字符串转为json对象时顺序不变

解决方法

方法一:解析时增加参数不调整顺序(亲测使用有效)

JSONObject respondeBodyJson = JSONObjectparseObject(str, FeatureOrderedField);

方法二:配置有序对象

JSONObjectparseObject(str,LinkedHashMapclass,FeatureOrderedField);

方法三:初始化json对象为有序对象

JSONObject retObj = new JSONObject(true);

方法四:使用Gson解析

JsonObject returnData = new JsonParser()parse(str)getAsJsonObject();

这样生成的json对象就与放入数据时保持一致了

注意:引入的fastjson相关的jar包版本要高于123,因为FeatureOrderedField是从123开始的

我想了一下,但是得有一个前提,就是第一个json数组的size必须和第二个json数组的size相同,并且一一对应,否则将造成数组溢出。

如果是基于上面这个前提,那么实现的方法就简单了。

*** 作json对象,其实标准的方法是将实体类转换成json后再 *** 作,我这里的话为了便捷直接使用谷歌的Gson来创建JsonObject了,其他的json依赖还有阿里巴巴的FastJson等等,看你平时用什么习惯。

引入Gson依赖:

<dependency>

<groupId>comgooglecodegson</groupId>

<artifactId>gson</artifactId>

<version>280</version>

</dependency>

实现代码:

public class Main {

public static void main(String[] args) {

JsonArray jsonArray1 = new JsonArray();

JsonObject json11 = new JsonObject();

json11addProperty("数据1", "0000");

json11addProperty("数据2", "1111");

JsonObject json12 = new JsonObject();

json12addProperty("数据1", "0000");

json12addProperty("数据2", "1111");

JsonObject json13 = new JsonObject();

json13addProperty("数据1", "0000");

json13addProperty("数据2", "1111");

jsonArray1add(json11);

jsonArray1add(json12);

jsonArray1add(json13);

Systemoutprintln(jsonArray1);

JsonArray jsonArray2 = new JsonArray();

JsonObject json21 = new JsonObject();

json21addProperty("数据3", "6666");

JsonObject json22 = new JsonObject();

json22addProperty("数据3", "6666");

JsonObject json23 = new JsonObject();

json23addProperty("数据3", "6666");

jsonArray2add(json21);

jsonArray2add(json22);

jsonArray2add(json23);

Systemoutprintln(jsonArray2);

//遍历json数组,按位取出对象

for (int i = 0; i < jsonArray1size(); i++) {

JsonObject json1 = jsonArray1get(i)getAsJsonObject();

JsonObject json3 = jsonArray2get(i)getAsJsonObject();

//遍历数据3内容,通过Entry获取数据3的key和value,并合并到数据1中

for (MapEntry<String, JsonElement> item : json3entrySet()) {

json1addProperty(itemgetKey(), itemgetValue()getAsString());

}

}

Systemoutprintln(jsonArray1);

}

}

整体思路为:遍历两个json数组,按位进行合并 *** 作。合并时,遍历数据3的jsonObject,获取其key和value,并将其合并到数据1中即可。

运行结果:

有个简单的,就是你直接使string然后把它new JSONobject 然后使用迭代器,for循环,然后就不用管什么value key 直接输出存成string就行。或是拼接。这样就不需要大量的 *** 作几行代码即可。

先给出测试的Model代码

package comexamplejsondemo;

public class Person {

private String name;

private int age;

private Birthday birthday;

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

thisage = age;

}

public Birthday getBirthday() {

return birthday;

}

public void setBirthday(Birthday birthday) {

thisbirthday = birthday;

}

public Person() {

super();

}

public Person(String name, int age, Birthday birthday) {

super();

thisname = name;

thisage = age;

thisbirthday = birthday;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + ", birthday="

+ birthday + "]";

}

}

为了让构造的对象更加复杂,所以定义了这个类,这样person类的属性就不只有基本数据类型了,让我们的测试更有代表性。

package comexamplejsondemo;

/

@ClassName: comexamplejsondemoBirthday

@Description: 生日类

@author zhaokaiqiang

@date 2014-11-26 上午10:29:47

/

public class Birthday {

private int year;

private int month;

private int day;

public int getYear() {

return year;

}

public void setYear(int year) {

thisyear = year;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

thismonth = month;

}

public int getDay() {

return day;

}

public void setDay(int day) {

thisday = day;

}

public Birthday() {

super();

}

public Birthday(int year, int month, int day) {

super();

thisyear = year;

thismonth = month;

thisday = day;

}

@Override

public String toString() {

return "Birthday [year=" + year + ", month=" + month + ", day=" + day

+ "]";

}

}

1Object与Json的相互转换

咱们先从最简单的单一对象开始说。

下面是代码实现

/

单一对象的json生成与解析

/

public void objectToJson() {

Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));

Gson gson = new Gson();

String jsonString = gsontoJson(p);

Logd(TAG, "---------单一对象生成--------");

Logd(TAG, jsonString);

Person person = gsonfromJson(jsonString, Personclass);

Logd(TAG, "---------单一对象解析--------");

Logd(TAG, persontoString());

}

这代码是多么的简洁,美观啊!

在上一篇的文章中,如果要生成简单对象的话,我们还需要自己指定key,然后设置value,自从用了Gson,我们再也没有这些烦恼了!而且为了说明Gson的强大之处,我还特意给Person设置了一个对象Birthday,如果使用自带的json工具,那不就麻烦死了。但是使用Gson,根本不需要有这些顾虑。看下面的转换结果,一个toJson(),完全解决问题,太棒了!

11-26 16:16:38392: D/GsonTest(16931): ---------单一对象生成--------

11-26 16:16:38392: D/GsonTest(16931): {"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}

11-26 16:16:38392: D/GsonTest(16931): ---------单一对象解析--------

11-26 16:16:38392: D/GsonTest(16931): Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]

2集合泛型与Json的相互转换

Gson除了可以很方便的与单一对象进行转换之外,还能够与集合进行转换。

下面是一个生成Json,并完成解析的代码:

/

集合对象的json生成与解析

/

public void objectsToJson() {

Gson gson = new Gson();

Person person = new Person("zhaokaiqiang", 22,

new Birthday(1992, 1, 19));

ArrayList<Person> arrayList = new ArrayList<Person>();

arrayListadd(person);

arrayListadd(person);

arrayListadd(person);

String jsonString = gsontoJson(arrayList);

Logd(TAG, "---------集合对象生成--------");

Logd(TAG, jsonString);

Type type = new TypeToken<ArrayList<Person>>() {

}getType();

ArrayList<Person> persons = gsonfromJson(jsonString, type);

Logd(TAG, "---------集合对象解析--------");

Logd(TAG, personstoString());

}

这是转换出来的结果

---------集合对象生成--------

[{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}]

---------集合对象解析--------

[Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]]

如果我们想使用json完成类似的功能,复杂度是不可想象的,但是使用Gson来实现的话,却是如此简单。

在使用GsontoJson()方法的时候,我们可以把任何对象或者是集合放进去,就可以完美的转换成json格式。

如果想把json格式的数据转换成我们想要的对象,我们只需要调用GsonfromJson()即可。

但是在转换的时候,第二个参数有两种形式,一种是Class<>,这个是转换单一对象的时候,我们需要把对象class传递进去,告诉转换器要转换的类型。如果我们需要转换的是集合类型,我们需要传递一个实现了Type接口的实例,具体语法就和上面的代码一样,只要把你用的集合类型还有具体的对象换一下就可以了。

------------------------------------------------------------分割线------------------------------------------------------------------

以上的内容是最简单的Gson的用法,我们基本上只使用到了Gson这一个类,对于基本需求来说没问题,

但是,如果想要创建和解析复杂的Json数据,就有点不够了。为了说明如何使用Gson解析更加复杂的数据,

特添加以下内容,即Gson的更高级用法

------------------------------------------------------------分割线--------------------------------------------------------------------

3复杂json数据结构的构建与解析

我们首先看看如何构建复杂的Json数据。

上一篇文章中,我们已经知道Json数据有两种形式,Object形式(其实就是键值对形式),Array形式(即数组形式),我们以Object形式为例,介绍构建复杂Json。

在开始构造之前,我们需要先介绍几个常用对象。

Gson:这个类在前面已经用过了,是我们完成json转换和解析的主要类,主要使用toJson()和fromJson()这两个方法。

JsonObject:这个是我们构建Object形式的Json数据的主要类,我们可以设置key和value。

JsonElement:这个是Json元素类,它里面可以是一个JsonObject、JsonArray、JsonNull或者是一个JsonPrimitive。注意,它里面的数据只能看作是一个元素。

JsonArray:这个是我们想构造Array形式的主要类,我们可以往数组里面添加数据,数据是有序的。

JsonParser:这个是Json的解析器,主要作用是把一个Json形式的字符串转换成一个JsonElement对象。

介绍完这些常用对象之后,我们下面看一下代码实现吧。

public String getJsonString() {

Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));

JsonElement jsonElement = new JsonParser()parse(new Gson()toJson(p));

JsonObject jsonObject = new JsonObject();

jsonObjectaddProperty("name", "zhao");

jsonObjectaddProperty("age", 22);

jsonObjectadd("person", jsonElement);

Logd(TAG, "getJsonString------" + jsonObjecttoString());

return jsonObjecttoString();

}

在上面的方法中,我们使用JsonParser和Gson只是为了获取一个JsonElement对象,因为使用JsonObject构造Object形式的Json数据的时候,基本数据类型可以使用addProperty()方法直接添加进去,但是如果想添加类的话,必须包装成一个JsonElement对象之后才能够添加,所以先用Gson的toJson()转换成一个Json格式的数据,然后使用JsonParser转换成一个JsonElement,使用add()添加进去之后,直接JsonObjecttoString()就可以获取到复杂对象的Json格式数据了。

下面是输出的结果,没有任何问题。

getJsonString------{"name":"zhao","age":22,"person":{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}}

知道了如何使用上面的这些类实现Json数据构建之后,下面我们讲解一下如何解析上面的这种复杂的json数据。

我们先看代码吧

public void fromJsonString() {

Gson gson = new Gson();

JsonElement jsonElement = new JsonParser()parse(getJsonString());

JsonObject jsonObject = jsonElementgetAsJsonObject();

JsonElement personElement = jsonObjectget("person");

Person person = gsonfromJson(personElement, Personclass);

JsonElement nameElement = jsonObjectget("name");

String name = nameElementgetAsString();

JsonElement ageElement = jsonObjectget("age");

int age = ageElementgetAsInt();

Logd(TAG, "person-----" + person);

Logd(TAG, "name-----" + name);

Logd(TAG, "age-----" + age);

}

如果我们要进行解析,我们必须获取到JsonElement对象,然后转换成JsonObject对象之后才能继续处理,所以在代码中进行了这样的处理。因为JsonElement是我们处理的基本元素,所以在获取到JsonObject之后,我们还需要根据key获取到对应value的JsonElement对象,然后根据不同的类型进行不同的转换即可。

知道了这些之后,完成80%的业务需求应该没问题了。

以上就是关于json.parseobject()的set方法设置顺序全部的内容,包括:json.parseobject()的set方法设置顺序、求java合并json数据的代码、Android 怎样将一组json数据的key value对应的放入到listview中显示两列等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9802645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存