GVKun编程网logo

为什么在递归清理 json 对象时出现“unhashable type: dict”错误?(json递归解析)

6

本文将带您了解关于为什么在递归清理json对象时出现“unhashabletype:dict”错误?的新内容,同时我们还将为您解释json递归解析的相关知识,另外,我们还将为您提供关于C#[HashT

本文将带您了解关于为什么在递归清理 json 对象时出现“unhashable type: dict”错误?的新内容,同时我们还将为您解释json递归解析的相关知识,另外,我们还将为您提供关于C# [HashTable、HashSet和Dictionary的区别]、HashTable Dictionary HashMap、HashTable、HashSet和Dictionary的区别、java – 为什么JSON中的中文字符会导致JSON.parse出现“错误的控制字符”错误?的实用信息。

本文目录一览:

为什么在递归清理 json 对象时出现“unhashable type: dict”错误?(json递归解析)

为什么在递归清理 json 对象时出现“unhashable type: dict”错误?(json递归解析)

乍一看,这似乎是一个问题:

if val not in missing_indicators

当您在 in 上使用 set 时,它会检查您询问的值是否在 set 条目中。要成为 Python 中 dict 的键或 set 的成员,您使用的值必须hashable。您可以通过在其上运行 hash 来检查 Python 中的值是否可散列:

>>> hash(1)
1
>>> hash("hello")
7917781502247088526
>>> hash({"1":"2"})
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
TypeError: unhashable type: 'dict'

在您的代码段中,看起来 val 是一个 dict 并且您询问 Python 此 val 是否是 set 中存在的 之一{1}}。作为响应,Python 尝试 hash val,但失败了。

您必须克服的障碍是某些外部 dict 中的值本身就是 dict,而其他值看起来像 liststrint。在每种情况下,您都需要不同的策略:检查 val 是什么类型的事物,然后采取相应的行动。

C# [HashTable、HashSet和Dictionary的区别]

C# [HashTable、HashSet和Dictionary的区别]

[HashTable、HashSet和Dictionary的区别]

 1.HashTable 散列表

  哈希表(HashTable)表示键/值对的集合。在**.NET Framework中**,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key-value键值对均为object类型,所以Hashtable可以支持任何类型的key,value键值对,任何非 null 对象都可以用作键或值。

  在哈希表中添加一个key/键值对:

HashtableObject.Add(key,); 

  在哈希表中去除某个key/键值对:

HashtableObject.Remove(key);

  从哈希表中移除所有元素:

HashtableObject.Clear(); 

  判断哈希表是否包含特定键key:

 HashtableObject.Contains(key);

  2.HashSet 散列集

  HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素,HashSet拒绝接受重复的对象。

  HashSet<T>的一些特性如下:

  a. HashSet<T>中的值不能重复且没有顺序。

  b. HashSet<T>的容量会按需自动添加。

  3.Dictionary 字典

  Dictionary表示键和值的集合。

  Dictionary<string, string>是一个泛型

  他本身有集合的功能有时候可以把它看成数组

  他的结构是这样的:Dictionary<[key], [value]>

  他的特点是存入对象是需要与[key]值一一对应的存入该泛型

  通过某一个一定的[key]去找到对应的值

  4.HashTable和Dictionary的区别:

  (1).HashTable不支持泛型,而Dictionary支持泛型。

  (2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

  (3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。

  (4)在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。

Demo Code

static void IntMethod()
        {
            int count = 1000000;
            Dictionary<int, int> dictionary = new Dictionary<int, int>();
            Hashtable hashtable = new Hashtable();
            for (int i = 0; i < count; i++)
            {
                dictionary.Add(i,i);
                hashtable.Add(i,i);
            }

            Stopwatch stopwatch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                int value = dictionary[i];
            }
            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);

            stopwatch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                object value = hashtable[i];
            }
            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds);
 
        }

        static void MethodString()
        {
            int count = 1000000;
            Dictionary<string, string> dictionary = new Dictionary<string, string>();
            Hashtable hashtable=new Hashtable();
            for (int i = 0; i < count; i++)
            {
                dictionary.Add(i.ToString(),"aaa");
                hashtable.Add(i.ToString(),"aaa");
            }

            Stopwatch stopwatch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                string value=dictionary[i.ToString()];
            }
            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);

            stopwatch = Stopwatch.StartNew();
            for (int i = 0; i < count; i++)
            {
                object value = hashtable[i.ToString()];
            }
            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds);
        }

HashTable Dictionary HashMap

HashTable Dictionary HashMap

HashTable和HashMap

脑海中一直存在两个Hash,一个是HashMap另一个是HashTable,今天来总结一下两者的区别

相同点:表示根据键的哈希代码进行组织的键/值对的集合,哈希表也叫散列表。

区别:HashMap在C#中不存在的,而是在Java中

1.C#每一个元素都是存储在DictionaryEntry对象中的键/值对,键不能为 null,但值可以。

2.在Java的HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。

因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断

HashTable示例

using System;
using System.Collections;
 
namespace MyCollection
{
    public class HashTableExample
    {
        static void Main()
        {
            // Create a new hash table.
            Hashtable openWith = new Hashtable();
 
            // key没有重复,但是value有重复.
            openWith.Add("txt","notepad.exe");
            openWith.Add("bmp",1)">"paint.exe");
            openWith.Add("dib",1)">"rtf",1)">"wordpad.exe");
 
            //如果key重复,进行catch处理
            try
            {
                openWith.Add("winword.exe");
            }
            catch
            {
                Console.WriteLine("An element with Key = \"txt\" already exists.");
            }
 
            // 通过key获取value
            Console.WriteLine("For key = \"rtf\",value = {0}.",openWith["rtf"]);
 
            //替换value
            openWith["rtf"] = "winword.exe";
            Console.WriteLine(//遍历HashTable
            foreach (DictionaryEntry de in openWith)
            {
                Console.WriteLine(de.Key);
            }
 
            //获取Keys
            ICollection keCollection = openWith.Keys;
            foreach (string s in keCollection)
            {
                Console.WriteLine("key = {0}",s);
            }
 
            //删除指定的key
            openWith.Remove("doc");
            if (!openWith.Contains("doc"))
            {
                Console.WriteLine("Key\"doc\" is not found");
            }
        }
    }
}

运行结果

HashTable和Dictionary

示例代码

HashTable、HashSet和Dictionary的区别

HashTable、HashSet和Dictionary的区别

1.HashTable

哈希表(HashTable)表示键/值对的集合。在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key-value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对,任何非 null 对象都可以用作键或值。

在哈希表中添加一个key/键值对:HashtableObject.Add(key,);

在哈希表中去除某个key/键值对:HashtableObject.Remove(key);

从哈希表中移除所有元素: HashtableObject.Clear();

判断哈希表是否包含特定键key: HashtableObject.Contains(key);

2.HashSet

HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素,HashSet拒绝接受重复的对象。

HashSet<T>的一些特性如下:

a. HashSet<T>中的值不能重复且没有顺序。

b. HashSet<T>的容量会按需自动添加。

3.Dictionary

Dictionary表示键和值的集合。

Dictionary<string, string>是一个泛型

他本身有集合的功能有时候可以把它看成数组

他的结构是这样的:Dictionary<[key], [value]>

他的特点是存入对象是需要与[key]值一一对应的存入该泛型

通过某一个一定的[key]去找到对应的值

4.HashTable和Dictionary的区别:

(1).HashTable不支持泛型,而Dictionary支持泛型。

(2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

(3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。

 

原文地址:http://www.cnblogs.com/akwwl/p/3680376.html

java – 为什么JSON中的中文字符会导致JSON.parse出现“错误的控制字符”错误?

java – 为什么JSON中的中文字符会导致JSON.parse出现“错误的控制字符”错误?

我有一个标准的HTML5类型的客户端/服务器设置.服务器端都是Java,客户端是JavaScript.使用ajax我发送查询并接收回复.到目前为止,我对JSON.parse(数据)没有任何问题.但是,我有一个新用户使用中文字符输入她的姓氏.这导致客户端“JSON.parse:字符串文字中的错误控制字符”错误.

服务器按如下方式构建回复(省略异常处理):

JSONObject jsono = new JSONObject();
jsono.put("last_name", last_name);
jsono.put("first-name", first_name);
String response = jsono.toString();

客户收到如下内容:

{"last_name":"Smith","first_name":"Bob"}

回复显示在设置为< Meta charset =“utf-8”>的网页上:

var theResult = JSON.parse(data);
$('#first_name').html(theResult.first_name);

这很好用.但是,对于中国用户,客户端会收到

{"last_name":"唐","first_name":"Bob"}

这会导致json.parse错误.

我现在开始看其他角色了.例如,Andrés不会导致错误,但也无法正常显示.它看起来像安德烈斯.

所以,我显然遗漏了一些东西.有人可以告诉我问题所在(例如,它是服务器端吗?客户端?JavaScript?jquery?html?)以及如何解决它?

解决方法:

我使用的Java中最有用的库是Gson API和JSONObject,两者都可以解决这个问题,如果你这样,你的问题可能已经解决了.请注意这里所有与utf-8相关的参数非常重要:

JSONObject jsono = new JSONObject();
jsono.put("last_name", "唐");
jsono.put("first-name", firstName);
String myjsonString = jsono.toString();

//write your output
DataOutputStream out = new DataOutputStream(new FileOutputStream("myjson.txt"));
out.write(myjsonString.getBytes("utf-8"),0, myjsonString.getBytes("UTF-8").length);

今天的关于为什么在递归清理 json 对象时出现“unhashable type: dict”错误?json递归解析的分享已经结束,谢谢您的关注,如果想了解更多关于C# [HashTable、HashSet和Dictionary的区别]、HashTable Dictionary HashMap、HashTable、HashSet和Dictionary的区别、java – 为什么JSON中的中文字符会导致JSON.parse出现“错误的控制字符”错误?的相关知识,请在本站进行查询。

本文标签: