如何在android中将HashMap转换为json数组?

Posted

技术标签:

【中文标题】如何在android中将HashMap转换为json数组?【英文标题】:How to convert HashMap to json Array in android? 【发布时间】:2013-03-02 09:24:05 【问题描述】:

我想将HashMap转换为json array我的代码如下:

Map<String, String> map = new HashMap<String, String>();

map.put("first", "First Value");

map.put("second", "Second Value");

我已经尝试过了,但没有成功。有什么解决办法吗?

JSONArray mJSONArray = new JSONArray(Arrays.asList(map));

【问题讨论】:

那么,你有一个Map,但是想要一个Array?好吧,首先进行转换,独立于 JSON,然后将结果(现在是列表/数组)提供给适当的 JSON 转换器。发布的代码将不起作用 - 并且会导致编译器错误,应该包含在帖子中 - 因为没有 Arrays.asList(Map&lt;K,V&gt;),因为没有通用转换,这没有意义(尽管,也许你想要一个条目列表?)。也就是说,这个问题/问题与JSON没有直接关系。 @pst:谢谢,但是有什么解决办法吗?用 key=> value 创建数组并将其转换为 json?在安卓活动中 数组没有“key=>value”。提供示例地图数据和预期的 JSON 数组输出。 键值只对集合中的Map族可用,尝试将Map转换成String,玩String。 【参考方案1】:

试试这个,

public JSONObject (Map copyFrom) 

通过从给定映射中复制所有名称/值映射来创建一个新的 JSONObject。

参数 copyFrom 一个映射,它的键是 String 类型,其值是支持的类型。

投掷 如果地图的任何键为空,则出现 NullPointerException。

基本用法:

JSONObject obj=new JSONObject(yourmap);

从 JSONObject 中获取 json 数组

编辑:

JSONArray array=new JSONArray(obj.toString());

编辑:(如果发现异常,则您可以更改为@krb686 评论中提到的)

JSONArray array=new JSONArray("["+obj.toString()+"]");

【讨论】:

我试过了,但没用。你能把代码贴在这里吗? 我不知道应该使用什么逻辑。我只能希望它经过测试 - 显示输入及其产生的内容(在每个阶段)将使这是一个可以接受的答案。 @Pragnani 不幸的是,这不起作用。也许以前是这样,但现在不是了。这会抛出:A JSONArray text must start with '[' at character 1 在从 JSONObject Fix 创建 JSONArray 的行中,您需要更改为:JSONArray array=new JSONArray("[" + obj.toString() + "]"); 您可以编辑它吗?谢谢 在 java 7, api 26 android 中,以上解决方案都没有产生有效的 json 数组输出。 map.toString() 函数产生大括号,,而不是括号,[]【参考方案2】:

从 android API Lvl 19 开始,你可以简单地做new JSONObject(new HashMap())。但是在较旧的 API lvls 上,您会得到丑陋的结果(简单地将 toString 应用于每个非原始值)。

我从 JSONObject 和 JSONArray 中收集了方法来简化和美观的结果。你可以使用我的解决方案类:

package you.package.name;

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

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

public class JsonUtils

    public static JSONObject mapToJson(Map<?, ?> data)
    
        JSONObject object = new JSONObject();

        for (Map.Entry<?, ?> entry : data.entrySet())
        
            /*
             * Deviate from the original by checking that keys are non-null and
             * of the proper type. (We still defer validating the values).
             */
            String key = (String) entry.getKey();
            if (key == null)
            
                throw new NullPointerException("key == null");
            
            try
            
                object.put(key, wrap(entry.getValue()));
            
            catch (JSONException e)
            
                e.printStackTrace();
            
        

        return object;
    

    public static JSONArray collectionToJson(Collection data)
    
        JSONArray jsonArray = new JSONArray();
        if (data != null)
        
            for (Object aData : data)
            
                jsonArray.put(wrap(aData));
            
        
        return jsonArray;
    

    public static JSONArray arrayToJson(Object data) throws JSONException
    
        if (!data.getClass().isArray())
        
            throw new JSONException("Not a primitive data: " + data.getClass());
        
        final int length = Array.getLength(data);
        JSONArray jsonArray = new JSONArray();
        for (int i = 0; i < length; ++i)
        
            jsonArray.put(wrap(Array.get(data, i)));
        

        return jsonArray;
    

    private static Object wrap(Object o)
    
        if (o == null)
        
            return null;
        
        if (o instanceof JSONArray || o instanceof JSONObject)
        
            return o;
        
        try
        
            if (o instanceof Collection)
            
                return collectionToJson((Collection) o);
            
            else if (o.getClass().isArray())
            
                return arrayToJson(o);
            
            if (o instanceof Map)
            
                return mapToJson((Map) o);
            
            if (o instanceof Boolean ||
                    o instanceof Byte ||
                    o instanceof Character ||
                    o instanceof Double ||
                    o instanceof Float ||
                    o instanceof Integer ||
                    o instanceof Long ||
                    o instanceof Short ||
                    o instanceof String)
            
                return o;
            
            if (o.getClass().getPackage().getName().startsWith("java."))
            
                return o.toString();
            
        
        catch (Exception ignored)
        
        
        return null;
    

然后,如果您将 mapToJson() 方法应用于您的地图,您可以获得如下结果:


  "int": 1,
  "Integer": 2,
  "String": "a",
  "int[]": [1,2,3],
  "Integer[]": [4, 5, 6],
  "String[]": ["a","b","c"],
  "Collection": [1,2,"a"],
  "Map": 
    "b": "B",
    "c": "C",
    "a": "A"
  

【讨论】:

甜蜜!我希望我能给这个+10!我将不得不查看 API 19 的源代码,看看他们是否正在这样做。谢谢! 在发送不可解码字符串时遇到了同样的问题:key=value, key2=value2【参考方案3】:

这是最简单的方法。

随便用

JSONArray jarray = new JSONArray(hashmapobject.toString);

【讨论】:

【参考方案4】:

映射由键/值对组成,即每个条目有两个对象,而列表的每个条目只有一个对象。你可以做的是提取所有Map.Entry<K,V>,然后将它们放入数组中:

Set<Map.Entry<String, String> entries = map.entrySet();
JSONArray mJSONArray = new JSONArray(entries);

或者,有时将键值提取到集合中很有用:

Set<String> keys = map.keySet();
JSONArray mJSONArray = new JSONArray(keys);

List<String> values = map.values();
JSONArray mJSONArray = new JSONArray(values);

注意:如果您选择使用 keys 作为条目,则无法保证顺序(keySet() 方法返回 Set)。这是因为Map 接口没有指定任何顺序(除非Map 恰好是SortedMap)。

【讨论】:

【参考方案5】:

你可以使用

JSONArray jarray = JSONArray.fromObject(map );

【讨论】:

试试这个:***.com/questions/9210273/… 这些类在 JSON-Lib 库中可用。你可以在这里找到这个库:json-lib.sourceforge.net @Forhad:谢谢,但是我的哈希是在我的代码中动态创建的,所以它不适合我,还有其他选项可以使用 key=>value 创建数组并在 android 活动中转换为 json 吗?

以上是关于如何在android中将HashMap转换为json数组?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 android 中将 Spannable 转换为 String 以加载 ExpandableListView 吗?

如何将 HashMap 保存到共享首选项?

如何在android中将图标转换为位图? [复制]

如何在Android中将double转换为int? [复制]

如何在android中将毫秒转换为日期格式?

如何在android中将jsonstring转换为jsonobject?