我想借助模板引擎生成有效的 JSON。特别是,我希望引擎用模型类的属性替换模板中的占位符。
引擎应该允许使用转换器来处理复杂的类,例如 java.util.Date。
此外,我不想在模板本身中显式处理列表,而是希望任何类似集合的类型都能生成有效的 JSON 数组。
这可能是一个模板示例:
{
"uber" :
{
"version" : "1.0",
"data" :
[
{
"rel" : $relations,
"data" :
[
{"name" : "firstname", "value" : $firstname},
{"name" : "lastname", "value" : $lastname}
]
}
]
}
}
我想从具有关系的模型中替换此模板中的变量($relations、$firstname、$lastname) ,名字和姓氏属性。这也适用于嵌套属性。 (例如:$address.street)
绑定(bind)模型后,JSON 可能如下所示:
{
"uber" :
{
"version" : "1.0",
"data" :
[
{
"rel" : ["person"],
"data" :
[
{"name" : "firstname", "label" : "Firstname", "value" : "Max"},
{"name" : "lastname", "label" : "Lastname", "value" : "Mustermann"}
]
}
]
}
}
请注意,引擎需要注意在必要时使用引号。
是否有任何模板库能够执行此操作,或者我是否需要推出自己的库?
我已经研究了以下库:
我还阅读了几个主题:
但是,到目前为止,我还没有找到满意的解决方案。
背景信息:
Uber是与域无关的超媒体格式,它嵌套 data 元素以对数据进行编码。
如果您想使用像 Jackson 这样的库对其进行序列化,则生成这种格式非常麻烦,因为您必须创建大量对象并通过 setter 嵌套它们,这会导致大量代码并且也非常容易出错。
这就是为什么我想到使用模板来生成输出并让用户编写模板,然后将模型绑定(bind)到该模板以生成输出。
最佳答案
我找到了问题的答案:
我在我的模板中对变量使用以下符号:$(json.path.to.value)。
我已经从 JsonPath 中实现了自定义 Predicate JayWay 的库,它在 JSON 中查找符合变量定义的值。
谓词还采用一个 DocumentContext 来表示模型对象,应该从中获取变量的值。此文档上下文是通过使用 Jackson 序列化模型对象并使用 JsonPath 库重新读取它来创建的。这样,可以确保插入模板中的所有标记都是有效的 JSON 标记。
如果谓词找到变量,它会提取包含的 JsonPath 表达式,在提供的 DocumentContext 中查找新值并覆盖原始 JSON 中的值。
关于java - 具有 Java 绑定(bind)功能的简单模板库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720439/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我