GVKun编程网logo

JSONObject 转换Map与JSONArray转换List方式(jsonobject转list

21

对于JSONObject转换Map与JSONArray转换List方式感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍jsonobject转list,并为您提供关于011-JSON、JSONOb

对于JSONObject 转换Map与JSONArray转换List方式感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍jsonobject转list,并为您提供关于011-JSON、JSONObject、JSONArray使用、JSON数组形式字符串转换为List>的8种方法、android – org.json.jsonarray无法转换为jsonobject错误、Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断、FastJSON--Java对象、集合转换成JSONObject、JSONArray的有用信息。

本文目录一览:

JSONObject 转换Map与JSONArray转换List方式(jsonobject转list<map>)

JSONObject 转换Map与JSONArray转换List方式(jsonobject转list

很多情况下大家习惯性对数据类型进行强转,然后会报出类似can not case JSONObject  to Map。。。的错误信息,以下给出两种转换方式,供大家参考使用

if(jsonObj instanceof JSONObject){
    				LinkedHashMap linkMap = JSONObject.parseObject(JSON.toJSONString(jsonObj),LinkedHashMap.class, Feature.OrderedField);
    				
} else if(jsonObj instanceof JSONArray){
    				LinkedList subAry = JSONArray.parseObject(JSON.toJSONString(jsonObj), LinkedList.class, Feature.OrderedField);
    				
}

 

011-JSON、JSONObject、JSONArray使用、JSON数组形式字符串转换为List<Map<String,String>>的8种方法

011-JSON、JSONObject、JSONArray使用、JSON数组形式字符串转换为List>的8种方法

一、JSON数据格式

1.1、常用JSON数据格式

  1、对象方式:JSONObject的数据是用 { } 来表示的,

  例如: { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : null }

  2、数组方式:JSONArray,顾名思义是由JSONObject构成的数组,用 [ { } , { } , ...... , { } ] 来表示

  例如:[ { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业" } , { "content" : null, "beginTime" : 1398873600000 "endTime" } ] ;

  表示了包含2个JSONObject的JSONArray。

1.2、JSON、JSONObject、JSONArray使用

对象/数组 toJSONString parse parseObject parseArray
JSON 对象/数组

数据是对象时,返回:JSONObject的Object

数据是数组时,返回:JSONArray的Object

对象 数组
JSONObject 对象/数组

数据是对象时,返回:JSONObject的Object

数据是数组时,返回:JSONArray的Object

对象 数组
JSONArray 对象/数组

数据是对象时,返回:JSONObject的Object

数据是数组时,返回:JSONArray的Object

对象 数组
         

  parseObject:泛型实现 返回 具体bean;非泛型实现 返回 JSONObject

  parseArray:泛型实现 返回 具体List<bean>;非泛型实现 返回 JSONArray<JSONObject>

  parse:相当于parseObject和parseArray的非泛型实现

工具类Person

public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "name=''" + name + ''\'''' +
                ", age=" + age +
                ''}'';
    }
}
View Code

 

1.2.1、数据是 对象 方式测试【parseObject】

/**
 * 数据是 对象 测试
 */
public class ObjectJsonTest {

    @Test
    public void testtoJSONString(){
        Person person = new Person("aa", 1);
        String s1 = JSON.toJSONString(person);
        System.out.println(s1);
        String s2 = JSONObject.toJSONString(person);
        System.out.println(s2);
        String s3 = JSONArray.toJSONString(person);
        System.out.println(s3);
    }

    @Test
    public void testparseObject(){
        Person person = new Person("aa", 1);
        String s1 = JSON.toJSONString(person);
        System.out.println(s1);

        Person p1 = JSON.parseObject(s1, Person.class);
        JSONObject jsonObject = JSON.parseObject(s1);
        System.out.println(p1);
        Person p2 =  JSONObject.parseObject(s1, Person.class);
        System.out.println(p2);
        Person p3 =  JSONArray.parseObject(s1, Person.class);
        System.out.println(p3);
    }

    /**
     * 失败
     */
    @Test
    public void testparseArray(){
        Person person = new Person("aa", 1);
        String s1 = JSON.toJSONString(person);
        System.out.println(s1);

        //失败:转数组 必须是 list
        List<Person> p1 = JSON.parseArray(s1, Person.class);
        System.out.println(p1);
        //失败:转数组 必须是 list
        List<Person> p2 =  JSONObject.parseArray(s1, Person.class);
        System.out.println(p2);
        //失败:转数组 必须是 list
        List<Person> p3 =  JSONArray.parseArray(s1, Person.class);
        System.out.println(p3);
    }
}
View Code

 

 

 

1.2.2、数据是 数组 方式测试【parseArray】

/**
 * 数据是 数组 测试
 */
public class ArrayJsonTest {

    @Test
    public void testtoJSONString(){
        Person person = new Person("aa", 1);
        List<Person> list =new ArrayList<>();
        list.add(person);

        String s1 = JSON.toJSONString(list);
        System.out.println(s1);
        String s2 = JSONObject.toJSONString(list);
        System.out.println(s2);
        String s3 = JSONArray.toJSONString(list);
        System.out.println(s3);
    }

    //失败
    @Test
    public void testparseObject(){
        Person person = new Person("aa", 1);
        List<Person> list =new ArrayList<>();
        list.add(person);

        String s1 = JSON.toJSONString(list);
        System.out.println(s1);

        //失败:转对象 必须是 {}
        Person p1 = JSON.parseObject(s1, Person.class);
        System.out.println(p1);
        //失败:转对象 必须是 {}
        Person p2 =  JSONObject.parseObject(s1, Person.class);
        System.out.println(p2);
        //失败:转对象 必须是 {}
        Person p3 =  JSONArray.parseObject(s1, Person.class);
        System.out.println(p3);
    }

    @Test
    public void testparseArray(){
        Person person = new Person("aa", 1);
        List<Person> list =new ArrayList<>();
        list.add(person);

        String s1 = JSON.toJSONString(list);
        System.out.println(s1);

        List<Person> p1 = JSON.parseArray(s1, Person.class);
        System.out.println(p1);
        List<Person> p2 =  JSONObject.parseArray(s1, Person.class);
        System.out.println(p2);
        List<Person> p3 =  JSONArray.parseArray(s1, Person.class);
        System.out.println(p3);
    }
}
View Code

 

 

 

1.2.3、非泛型示例【主要是parseObject、parseArray以及parse】

/**
 * 非泛型示例
 */
public class JSONObjectJsonTest {

    //数据是 对象
    @Test
    public void testparseObject1(){
        Person person = new Person("aa", 1);
        String s1 = JSON.toJSONString(person);
        System.out.println(s1);

        JSONObject p1 = JSON.parseObject(s1);
        System.out.println(p1);
        System.out.println(p1.getString("name"));
        JSONObject p2 =  JSONObject.parseObject(s1);
        System.out.println(p2);
        JSONObject p3 =  JSONArray.parseObject(s1);
        System.out.println(p3);
    }

    //数据是 对象
    @Test
    public void testparseObject2(){
        Person person = new Person("aa", 1);
        String s1 = JSON.toJSONString(person);
        System.out.println(s1);

        Object p1 = JSON.parse(s1);
        System.out.println(p1.getClass());
        System.out.println(p1);

        Object p2 =  JSONObject.parse(s1);
        System.out.println(p2.getClass());
        System.out.println(p2);

        Object p3 =  JSONArray.parse(s1);
        System.out.println(p3.getClass());
        System.out.println(p3);
    }

    //数据是 数组
    @Test
    public void testparseArray1(){
        Person person = new Person("aa", 1);
        List<Person> list =new ArrayList<>();
        list.add(person);

        String s1 = JSON.toJSONString(list);
        System.out.println(s1);

        JSONArray p1 = JSON.parseArray(s1);
        System.out.println(p1);
        JSONArray p2 =  JSONObject.parseArray(s1);
        System.out.println(p2);
        JSONArray p3 =  JSONArray.parseArray(s1);
        System.out.println(p3);
    }

    //数据是 数组
    @Test
    public void testparseArray2(){
        Person person = new Person("aa", 1);
        List<Person> list =new ArrayList<>();
        list.add(person);

        String s1 = JSON.toJSONString(list);
        System.out.println(s1);

        JSONArray p1 = (JSONArray)JSON.parse(s1);
        System.out.println(p1.getClass());
        System.out.println(p1);

        Object p2 =  JSONObject.parse(s1);
        System.out.println(p2.getClass());
        System.out.println(p2);

        Object p3 =  JSONArray.parse(s1);
        System.out.println(p3.getClass());
        System.out.println(p3);
    }
}
View Code

 

二、JSON数组形式字符串转换为List<Map<String,String>>的8种方法

public class JsonToLIstMapTest {
    String strArr = "[{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}," +
            "{\"00\":\"zhangsan\",\"11\":\"lisi\",\"22\":\"wangwu\",\"33\":\"maliu\"}]";
    @Test
    public void test(){
        //第一种方式
        List<Map<String,String>> listObjectFir = (List<Map<String,String>>) JSONArray.parse(strArr);
        System.out.println("1、利用JSONArray中的parse方法来解析json数组字符串");//com.alibaba.fastjson.JSONObject
        System.out.println("类型:"+listObjectFir.get(0).getClass());
        for(Map<String,String> mapList : listObjectFir){
            for (Map.Entry entry : mapList.entrySet()){
                System.out.println( entry.getKey()  + "  " +entry.getValue());
            }
        }
        //第二种方式
        List<Map<String,String>> listObjectSec = JSONArray.parseObject(strArr,List.class);
        System.out.println("2、利用JSONArray中的parseObject方法并指定返回类型来解析json数组字符串");//com.alibaba.fastjson.JSONObject
        System.out.println("类型:"+listObjectSec.get(0).getClass());
        for(Map<String,String> mapList : listObjectSec){
            for (Map.Entry entry : mapList.entrySet()){
                System.out.println( entry.getKey()  + "  " +entry.getValue());
            }
        }
        //第三种方式
        JSONArray listObjectThir = JSONArray.parseArray(strArr);
        System.out.println("3、利用JSONArray中的parseArray方法来解析json数组字符串");
        System.out.println("类型:"+listObjectThir.get(0).getClass());//com.alibaba.fastjson.JSONObject
        for(Object mapList : listObjectThir){
            for (Object entry : ((Map)mapList).entrySet()){
                System.out.println(((Map.Entry)entry).getKey()  + "  " +((Map.Entry)entry).getValue());
            }
        }
        //第四种方式
        List listObjectFour = JSONArray.parseArray(strArr,Map.class);
        System.out.println("4、利用JSONArray中的parseArray方法并指定返回类型来解析json数组字符串");
        System.out.println("类型:"+listObjectFour.get(0).getClass());//java.util.HashMap
        for(Object mapList : listObjectFour){
            for (Object entry : ((Map)mapList).entrySet()){
                System.out.println(((Map.Entry)entry).getKey()  + "  " +((Map.Entry)entry).getValue());
            }
        }
        //第五种方式
        JSONArray listObjectFifth = JSONObject.parseArray(strArr);
        System.out.println("5、利用JSONObject中的parseArray方法来解析json数组字符串");
        System.out.println("类型:"+listObjectFifth.get(0).getClass());//com.alibaba.fastjson.JSONObject
        for(Object mapList : listObjectFifth){
            for (Object entry : ((Map)mapList).entrySet()){
                System.out.println(((Map.Entry)entry).getKey()  + "  " +((Map.Entry)entry).getValue());
            }
        }
        //第六种方式
        List listObjectSix = JSONObject.parseArray(strArr,Map.class);
        System.out.println("6、利用JSONObject中的parseArray方法并指定返回类型来解析json数组字符串");
        System.out.println("类型:"+listObjectSix.get(0).getClass());//java.util.HashMap
        for(Object mapList : listObjectSix){
            for (Object entry : ((Map)mapList).entrySet()){
                System.out.println(((Map.Entry)entry).getKey()  + "  " +((Map.Entry)entry).getValue());
            }
        }
        //第七种方式
        JSONArray listObjectSeven = JSON.parseArray(strArr);
        System.out.println("7、利用JSON中的parseArray方法来解析json数组字符串");
        System.out.println("类型:"+listObjectSeven.get(0).getClass());//com.alibaba.fastjson.JSONObject
        for(Object mapList : listObjectSeven){
            for (Object entry : ((Map)mapList).entrySet()){
                System.out.println(((Map.Entry)entry).getKey()  + "  " +((Map.Entry)entry).getValue());
            }
        }
        //第八种方式
        List listObjectEigh = JSONObject.parseArray(strArr,Map.class);
        System.out.println("8、利用JSON中的parseArray方法并指定返回类型来解析json数组字符串");
        System.out.println("类型:"+listObjectEigh.get(0).getClass());//java.util.HashMap
        for(Object mapList : listObjectEigh){
            for (Object entry : ((Map)mapList).entrySet()){
                System.out.println(((Map.Entry)entry).getKey()  + "  " +((Map.Entry)entry).getValue());
            }
        }
    }
}

 

android – org.json.jsonarray无法转换为jsonobject错误

android – org.json.jsonarray无法转换为jsonobject错误

我一直试图修复此错误2天,搜索并尝试从stackoverflow.com多种编码类型.我已经检查了我的 JSON http://jsonformatter.curiousconcept.com/#jsonformatter.但我仍然无法找出我的代码为什么这样做.我有3个文件. MainACtivity.java应该从我的服务器上的test.json文件中获取信息,然后将其处理到Events.java. Events.java只显示信息,但应用程序没有那么远.

在任何人的情况下更新的代码都需要这个的固定.

我的错误:

01-14 22:18:08.165: E/JSON Response:(419): > { "event":[ 
    01-14 22:18:08.165: E/JSON Response:(419):      {
    01-14 22:18:08.165: E/JSON Response:(419):       "event_name":"Test Event",01-14 22:18:08.165: E/JSON Response:(419):       "event_time":"7:00pm",01-14 22:18:08.165: E/JSON Response:(419):       "event_price":"$15.00"
    01-14 22:18:08.165: E/JSON Response:(419):      }
    01-14 22:18:08.165: E/JSON Response:(419):   ] 
    01-14 22:18:08.165: E/JSON Response:(419): }
    01-14 22:18:08.175: E/Json Error(419): Error: org.json.JSONException: Value         [{"event_price":"$15.00","event_time":"7:00pm","event_name":"Test Event"}] at event of type     org.json.JSONArray cannot be converted to JSONObject

MainActivity.java

package com.example.dba;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity 
{

String event_name,event_time,event_price;
static JSONObject object =null;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new PrefetchData().execute();
}

/**
 * Async Task to make http call
 */
private class PrefetchData extends AsyncTask<Void,Void,Void> 
{

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();      
    }

    @Override
    protected Void doInBackground(Void... arg0) 
    {

        JsonParser jsonParser = new JsonParser();
        String json = jsonParser.getJSONFromUrl("http://www.website/test.json");

        Log.e("JSON Response: ","> " + json);

        if (json != null) 
        {
           try 
            {
                JSONObject parent = new JSONObject(json);
                JSONArray eventDetails = parent.getJSONArray("event");

                for(int i=0; i < eventDetails.length(); i++)
                {
                    object = eventDetails.getJSONObject(i);
                    event_name = object.getString("event_name");
                    event_time = object.getString("event_time");
                    event_price = object.getString("event_price");

                    Log.e("JSON","> " + event_name + event_time + event_price );
                }
            }  catch (JSONException e) 
                {
                Log.e("Json Error","Error: " + e.toString());
                    e.printstacktrace();
                }

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) 
    {           
        super.onPostExecute(result);

        Intent i = new Intent(MainActivity.this,Events.class);
        i.putExtra("event_name",event_name);
        i.putExtra("event_time",event_time);
        i.putExtra("event_price",event_price);
        startActivity(i);

        // close this activity
        finish();
    }

}

}


}

解决方法

要更改的相关代码 – 在MainActivity.java的doInBackground()中:

JSONObject eventDetails = parent.getJSONObject("event");

至:

JSONArray eventDetails = parent.getJSONArray("event");

Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断

Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断

1.Fastjson

我们通常在已知格式的情况下直接使用JSONObject,JSONArray,但是如果遇到需要判断格式呢?

       try{
            Object object = JSON.parse(a);
            if (object instanceof JSONObject){
                //JSONObject
            }
            if (object instanceof JSONArray){
                //JSONArray
            }
        }catch (com.alibaba.fastjson.JSONException e){
            //非JSON字符串
        }

2.org.json.JSON

直接使用JSON库做解析的情况不多,但是这里也稍微写一下

log.info(JSON.parse(jsonStr).getClass().getName());
try {
    Object json = new JSONTokener(jsonStr).nextValue();
   log.info( json.getClass().toString());
//            json.toString();
    if(json instanceof JSONObject){
        log.info("is JSONObject");
        JSONObject jsonObject = (JSONObject)json;
        //further actions on jsonObjects
        //...
    }else if (json instanceof JSONArray){
        log.info("is JSONArray");
        JSONArray jsonArray = (JSONArray)json;
        //further actions on jsonArray
        //...
    }
}catch (Exception e){
    e.printstacktrace();
}

3.GSON,也是蛮强大的一个库,没有依赖包,只是在反射到Map的使用上有点麻烦。

GSON里面最有意思的就是JsonPrimitive,原始JSON。

先给代码

String str = "";
JsonParser jsonParser = new JsonParser();
try{
    JsonElement jsonElement = jsonParser.parse(str);
    log.info("jsonElement "+jsonElement.getClass().getName());
    if (jsonElement.isJsonObject()){
        //JsonObject
        log.info(jsonElement.getAsJsonObject().get("aa").getAsstring());
    }
    if (jsonElement.isJsonArray()){
        //JsonArray
        log.info(jsonElement.getAsJsonArray().get(0).getAsJsonObject().get("aa").getAsstring());
    }
    if (jsonElement.isJsonNull()){
        //空字符串
        log.info(jsonElement.getAsstring());
    }
    if (jsonElement.isJsonPrimitive()){
        log.info(jsonElement.getAsstring());
    }
}catch (Exception e){
    //非法
//            e.printstacktrace();
    log.info("非法 "+e.getMessage());
}

可知,GSON中定义了四个JSON类型,分别是JSONObject,JSONArray,JSONPrimitive,JSONNull。

但是官方对JSON的严格定义是{}为JSONObject,[]为JSONArray。

所以只用JsonElement jsonElement = jsonParser.parse(str);能正常解析的字符串并不意味着是一个合法的JSON,必须满足

jsonElement.isJsonObject()或者jsonElement.isJsonArray()。

另说一个题外话,关于对jsonElement.getAsJsonPrimitive()方法的理解。

JsonPrimitive即时指JSON value的原始数据,包含三种类型,数字,双引号包裹的字符串,布尔。

所以JsonPrimitive.toString得到的不是实际的值,而是JSON中的:后面的完整内容,需要再做一次getAs。

例如

String str = "{\"aa\":\"aa\"}";
JsonElement jsonElement = jsonParser.parse(str);
log.info(jsonElement.getAsJsonObject().get("aa").getAsstring());
str = "{\"aa\":true}";
jsonElement = jsonParser.parse(str);
jsonElement.getAsJsonObject().get("aa").getAsBoolean();
str = "{\"aa\":1.2}";
jsonElement.getAsJsonObject().get("aa").getAsBigDecimal();

所以Gson还有一个好处就是自带转换为java常规类型。

FastJSON--Java对象、集合转换成JSONObject、JSONArray

FastJSON--Java对象、集合转换成JSONObject、JSONArray

Student student=new Student();
//      Java对象转JSONObect对象
        JSONObject jsonObject=(JSONObject) JSONObject.toJSON(studentDTO.getCla***oom());
        JSONObject jsonObject2=JSONObject.parseObject(JSON.toJSONString(student.getCla***oom()));
        student.setCla***oom(jsonObject);
//      Java集合转JSON数组
        JSONArray jsonArray=(JSONArray) JSONArray.toJSON(studentDTO.getTeachers());
        JSONArray jsonArray2= JSONArray.parseArray( JSON.toJSONString(studentDTO.getCla***oom()) ) ;

我们今天的关于JSONObject 转换Map与JSONArray转换List方式jsonobject转list的分享就到这里,谢谢您的阅读,如果想了解更多关于011-JSON、JSONObject、JSONArray使用、JSON数组形式字符串转换为List>的8种方法、android – org.json.jsonarray无法转换为jsonobject错误、Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断、FastJSON--Java对象、集合转换成JSONObject、JSONArray的相关信息,可以在本站进行搜索。

本文标签: