我正在使用Jackson 2.2.3,需要将JsonNode树转换为带有排序字段键的字符串.我完全不清楚如何做到这一点,特别是因为相反的情况如此简单 - JsonNode jn = ObjectMapper.readTree(String s)
.
看来正确的方法是void writeTree(JsonGenerator jgen,JsonNode rootNode)
.但是,我认为没有办法String
从序列化中获取序列化JsonGenerator
.我认为这SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS
仍然适用,因为JsonGenerator.Feature
s没有那个选项.有没有更简单的方法 - 或者如果没有,我如何从JsonGenerator
?检索序列化的字符串?
我有一种情况,我需要知道一个String
/编码对的大小,以字节为单位,但不能使用该getBytes()
方法,因为1)String
非常大并且复制String
在一个byte[]
数组中将使用大量的内存,但更多的是第2点)根据*每个字符的最大可能字节长度getBytes()
分配一个byte[]
数组String
.因此,如果我有String
1.5B字符和UTF-16编码,getBytes()
将尝试分配3GB数组并失败,因为数组限制为2 ^ 32 - X字节(X是特定于Java版本).
那么 - 有没有办法String
直接从String
对象计算/编码对的字节大小?
更新:
这是jtahlborn答案的工作实现:
private class CountingOutputStream extends OutputStream {
int total;
@Override
public void write(int i) {
throw new RuntimeException("don't use");
}
@Override
public void write(byte[] b) {
total += b.length;
}
@Override public void write(byte[] b, int offset, int len) {
total += len;
}
}
Run Code Online (Sandbox Code Playgroud) import inspect
class Foo(object):
pass
if __name__ == '__main__':
print type(Foo.__init__)
print inspect.getsourcelines(Foo.__init__)
Run Code Online (Sandbox Code Playgroud)
输出:
<type 'wrapper_descriptor'>
Traceback (most recent call last):
*snip*
File "/usr/lib/python2.7/inspect.py", line 420, in getfile
'function, traceback, frame, or code object'.format(object))
TypeError: <slot wrapper '__init__' of 'object' objects> is not a module, class, method, function, traceback, frame, or code object
Run Code Online (Sandbox Code Playgroud)
谷歌搜索几乎没有提供有关什么,确切地说,wrapper_descriptor是什么,以及为什么空类有一个__init__
方法不是一个方法,而是一个wrapper_descriptor.
到底发生了什么?没有__init__
方法的所有类都有这些wrapper_descriptor之一吗?为什么__init__
课堂上有一个词典呢?
我想知道如何使用索引进行排序实际上在MongoDB中有效.有一对夫妇 的文章 MongoDB的文档中,但它们实际上并不说明如何排序所得或者时间复杂度.到目前为止,搜索SO和一般的互联网并没有发现任何相关的东西.
让我们假设有一个集合中的文档,查找()子句匹配b文件,还有的限制ç文档返回,一个 >> b >> Ç,和Ç是一些适当大的数量,使得返回集合无法适从内存 - 例如,假设1M文档.
在操作的开始,存在b需要进行排序和大小的排序树索引文件,一个为特征的文件将被排序.
我能想象:
A)按顺序遍历索引,并为每个ObjectID遍历b文档列表.返回匹配项,直到达到c.这将是O(ab).
B)作为A),但首先在b文档中构建ObjectID的哈希集.这是O(a),但需要O(b)内存.
我试图考虑基于遍历b文档集的排序,但似乎没有提出比O(b log b)更快的任何东西,这并不比没有索引的排序更好.
我假设(但也许我错了)每种类型都不需要索引扫描,那么排序实际上如何工作?
更新:
凯文的答案和提供的链接缩小了这个问题的范围,但我想确认/澄清几点:
排序如何处理$in
或$or
查询?例如,假设查询是
{a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}
......并有一个复合索引a
,并 …
我正在寻找一种算法(用Java编码会很好,但是任何足够清晰的转换为Java都很好)来绘制一条4连接线.似乎Bresenham的算法是使用最广泛的算法,但我发现的所有可理解的实现都是8连接的.OpenCV的cvline函数显然有一个4连接版本,但对我来说,源代码是一个平庸而且几乎是C文盲的程序员,难以理解.其他各种搜索都没有发现.
感谢任何人都能提供的帮助.
序言:我对REST的理解充其量是浅薄的,因此欢迎对我的问题进行任何更正或澄清.
我有一种情况,我需要RESTful服务的用户提交任意真正的正数.因此,我假设我不应该在url中要求它,即使返回的对象应该是相同的,并且应该使用参数(或者这个假设是错误的?).
鉴于此,为了符合REST,参数必须以某种方式被发现吗?我无法找到任何能让我清楚的事情.
如果没有,我进一步假设参数需要以其他方式记录,从而锁定(当前api的一部分),据我所知,这是不可取的,因为资源应该通过跟随超文本链接找到比硬编码位置(和这种情况下的参数).
假设参数必须是可发现的,有没有办法在tastypie/django中这样做?
有没有办法防止或改变Python中类变量的访问,因为可以通过覆盖__setattr__
实例变量?
请注意,此问题是错误的,实际上是指实例变量,而不是类变量.
在阅读关于(明显的)死亡陷阱的多篇帖子的基础上__slots__
,我宁愿不去那条路(而且我没有足够深入地了解它是否符合我的要求).
例:
class A(object):
foo = "don't change me"
def __setattr__(self, name, value):
raise ValueError
if __name__ == '__main__':
a1 = A()
print a1.foo # don't change me
print A.foo # don't change me
A.foo = 'bar' # ideally throw an exception or something here
print A.foo # bar
a2 = A()
print a1.foo # bar
print a2.foo # bar
Run Code Online (Sandbox Code Playgroud) 我使用python markdown作为Jinja2的过滤器来生成html.作为其中的一部分,我从渲染输入中填写表条目.通过markdown过滤器传递输入始终将文本包装在段落标记中,因此表中的每个条目都包含在内<p></p>
,这是我不想要的.
我已经阅读了降价文档和第三方扩展名列表,但除了编写自己的扩展名外,似乎无法抑制此行为.有没有其他方法可以抑制段落标记包装?或者我是以错误的方式来做这件事的?
更新:这是我现在正在使用的脏兮兮的糟糕黑客:
def safe_markdown(text):
p = '<p>'
np = '</p>'
md = markdown.markdown(text)
if md.startswith(p) and md.endswith(np): #you filthy bastard
md = md[len(p):-len(np)]
return jinja2.Markup(md)
env = jinja2.Environment(...)
env.filters['markdown'] = safe_markdown
Run Code Online (Sandbox Code Playgroud)
更新2(回应亚伦的回答):
感谢帮助,但这肯定是导致问题的降价.这是jinja模板的示例部分:
{%- if spc.docs -%}
<td>{{ spc.docs|markdown }}</td></tr>
{%- else -%}
<td></td></tr>
{%- endif -%}
Run Code Online (Sandbox Code Playgroud)
如果spc.docs
只是'foo'
生成的html会结束,<td><p>foo</p></td></tr>
除非我使用肮脏的黑客.
更新3
这是一个不那么讨厌的黑客,虽然仍然是一个黑客,而不是真正的'答案',IMO.
def safe_markdown(text):
md = markdown.markdown(text)
return jinja2.Markup(md)
def safe_markdown_td(text):
text = ''.join(['<td>', text, '</td>'])
return safe_markdown(text)
env …
Run Code Online (Sandbox Code Playgroud) 我正在研究将 NaN/Infinity 支持添加到使用 JSONRPC 进行客户端/服务器交互的现有科学应用程序的可行性。许多 JSON 库确实处理(在某些情况下可选)NaN 和 Infs,例如:
我知道JSON 规范不支持 NaN 和 Infinity ,并且知道相关 问题。但是,AFAICT 是否有某种方法可以强制本机 JSJSON.stringify()
方法发出 NaN/Infinity,或者是否有一个 JS JSON 库可以执行相同操作的问题尚未得到解答。与参考问题的细微差别,也许,但很重要。到目前为止,我一直无法发现这样的方法或库,所以我在这里。编写自己的 JSON 序列化程序是唯一的选择吗?
请注意,replacement
参数 ofJSON.stringify()
没有帮助,至少在我手中。
更新:将NaN/Infinity 等作为字符串发出会使这些字符串的语义不明确。它们需要像在 Python 和 GSON 实现中一样作为裸字发出。
对于以下命令, wherequery
只能匹配一个文档(请注意,bulkWrite()
默认情况下是有序的):
final BulkWriteResult res = db.getCollection("mycol").bulkWrite(Arrays.asList(
new UpdateOneModel<>(query,
new Document("$addToSet", new Document("some_things", things))),
new UpdateOneModel<>(query,
new Document("$pull", new Document("some_things", otherthings)))));
Run Code Online (Sandbox Code Playgroud)
...我知道如果第一次更新成功而第二次失败(在正常情况下应该是不可能的),第一次更新仍将应用于文档,这意味着批量写入不是严格原子的。但是,假设两个查询都成功,操作是原子的吗?例如,其他写入是否可以在两个操作之间交错?