本文将带您了解关于为什么在递归清理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递归解析)
- C# [HashTable、HashSet和Dictionary的区别]
- HashTable Dictionary HashMap
- HashTable、HashSet和Dictionary的区别
- java – 为什么JSON中的中文字符会导致JSON.parse出现“错误的控制字符”错误?
为什么在递归清理 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
,而其他值看起来像 list
, str
或 int
。在每种情况下,您都需要不同的策略:检查 val
是什么类型的事物,然后采取相应的行动。
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和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的区别
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出现“错误的控制字符”错误?
我有一个标准的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出现“错误的控制字符”错误?的相关知识,请在本站进行查询。
本文标签: