我需要将JSON中表示的一些JavaScript对象反序列化为适当的C#类.鉴于自动属性的优点,我宁愿在这些类中使用它们而不是只有字段.不幸的是,.NET序列化引擎(至少在默认情况下)完全忽略反序列化的自动属性,只关心支持字段,这显然不存在于JavaScript对象中.
鉴于没有标准的方法来命名支持字段,说实话,我甚至不想打扰"让我们创建一个看起来像C#支持字段的JavaScript对象"的方法,因为它听起来有点脏,唯一的方法如果我可以强制序列化引擎以某种方式忽略支持字段并直接使用属性,我可以将JavaScript字段序列化为C#auto-properties.不幸的是,我无法弄清楚这是如何完成的,或者是否可以完成.任何想法,将不胜感激.
编辑:这是一个例子:
使用Javascript:
function Cat()
{
this.Name = "Whiskers";
this.Breed = "Tabby";
}
var cat = new Cat();
Run Code Online (Sandbox Code Playgroud)
然后将其序列化为"{Name:'Whiskers'}".
C#类:
[Serializable()]
public class Cat
{
public string Name { get; set; }
public string Breed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而反序列化代码失败了:
new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);
Run Code Online (Sandbox Code Playgroud)
从例外情况可以看出它失败了,因为它正在寻找支持领域.
EDIT2:这是例外,如果有帮助(没有内部异常):
System.Runtime.Serialization.SerializationException
"数据合同类型'Test.Cat'无法反序列化,因为
<Name>k__BackingField, <Breed>k__BackingField找不到所需的数据成员' ."
我继承了一些在getter/setter上有@JsonProperty注释的位代码.目的是当使用Jackson库序列化对象时,字段具有该特定名称.
当前代码:
private String fileName;
@JsonProperty("FILENAME")
public String getFileName()
{
return fileName;
}
@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
Run Code Online (Sandbox Code Playgroud)
现在换另一个工具,我需要用JsonProperty来注释该字段.所以这将是我改变的代码:
@JsonProperty("FILENAME")
private String fileName;
@JsonProperty("FILENAME")
public String getFileName()
{
return fileName;
}
@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
Run Code Online (Sandbox Code Playgroud)
有没有人在这两个领域使用相同的注释 - 领域以及吸气剂/安装者?我环顾四周,但没有看到任何东西.
我已编译并运行代码,但我不确定这是否会导致任何问题.有什么想法吗?
我正在努力建立一个宁静的API,我正在努力如何将JSON数据序列化为HTTP query string.
需要在请求中传递许多强制和可选参数,例如(在下面表示为JSON对象):
{
"-columns" : [
"name",
"column"
],
"-where" : {
"-or" : {
"customer_id" : 1,
"services" : "schedule"
}
},
"-limit" : 5,
"return" : "table"
}
Run Code Online (Sandbox Code Playgroud)
我需要支持不同数量的不同客户端,所以我正在寻找一种标准化的方法将这个json对象转换为查询字符串.有一个,它看起来怎么样?
另一种方法是允许用户只是传递消息体中的json对象,但我读到我应该避免它(带请求体的HTTP GET).
有什么想法吗?
编辑以澄清:
列出一些不同的语言如何编码上面给定的json对象:
jQueryusing $.param:-columns [] = name&-columns [] = column&-where [-or] [customer_id] = 1&-where [-or] [services] = schedule&-limit = 5&return = columnPHPusing http_build_query:-columns [0] = name&-columns [1] = column&-where [-or] [customer_id] …我有一个需要jsonify的对象列表.我看过烧瓶jsonify文档,但我只是没有得到它.
我班有几个研究所,增值经销商,每一个都是一个字符串:gene_id,gene_symbol,p_value.我需要做什么才能将其序列化为JSON?
我天真的代码:
jsonify(eqtls = my_list_of_eqtls)
Run Code Online (Sandbox Code Playgroud)
结果是:
TypeError: <__main__.EqtlByGene object at 0x1073ff790> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
据推测,我必须告诉jsonify如何序列化EqtlByGene,但我找不到一个示例来说明如何序列化一个类的实例.
这段代码现在有效(非常感谢Martijn Pieters!):
class EqtlByGene(Resource):
def __init__(self, gene_id, gene_symbol, p_value):
self.gene_id = gene_id
self.gene_symbol = gene_symbol
self.p_value = p_value
class EqtlJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, EqtlByGene):
return {
'gene_id' : obj.gene_id,
'gene_symbol' : obj.gene_symbol,
'p_value' : obj.p_value
}
return super(EqtlJSONEncoder, self).default(obj)
class EqtlByGeneList(Resource):
def get(self):
eqtl1 = EqtlByGene(1, 'EGFR', 0.1)
eqtl2 = EqtlByGene(2, 'PTEN', 0.2) …Run Code Online (Sandbox Code Playgroud) 我正在用Qt库编写GUI.在我的GUI中,我有一个巨大的std :: map.
"MyType"是一个具有不同类型字段的类.
我想序列化std :: map.我怎样才能做到这一点?Qt是否为我们提供了必要的功能?
我有一个定义不可变值类型的类,我现在需要序列化.不变性来自构造函数中设置的最终字段.我已经尝试过序列化,它的确有效(令人惊讶的是?) - 但我不知道如何.
这是该课程的一个例子
public class MyValueType implements Serializable
{
private final int value;
private transient int derivedValue;
public MyValueType(int value)
{
this.value = value;
this.derivedValue = derivedValue(value);
}
// getters etc...
}
Run Code Online (Sandbox Code Playgroud)
鉴于该类没有没有arg构造函数,它如何实例化并设置最终字段?
(旁边 - 我注意到这个类特别是因为IDEA没有为这个类生成"no serialVersionUID"检查警告,但是成功地为我刚刚可序列化的其他类生成了警告.)
在序列化和反序列化期间如何调用构造函数
所以我不确定我要向你们展示什么,如果你需要更多代码,请不要犹豫,问:
所以这个方法将在我们的应用程序中为Zend设置initMailer:
protected function _initMailer()
{
if ('testing' !== APPLICATION_ENV) {
$this->bootstrap('Config');
$options = $this->getOptions();
$mail = new Zend_Application_Resource_Mail($options['mail']);
}elseif ('testing' === APPLICATION_ENV) {
//change the mail transport only if dev or test
if (APPLICATION_ENV <> 'production') {
$callback = function()
{
return 'ZendMail_' . microtime(true) .'.tmp';
};
$mail = new Zend_Mail_Transport_File(
array('path' => '/tmp/mail/',
'callback'=>$callback
)
);
Zend_Mail::setDefaultTransport($mail);
}
}
return $mail;
}
Run Code Online (Sandbox Code Playgroud)
你可以看到它所在的闭包.当我运行任何使用这段代码的测试时,我得到:
Exception: Serialization of 'Closure' is not allowed
Run Code Online (Sandbox Code Playgroud)
因此,与这种"封闭"有关的所有测试都失败了.所以我在这里问你们应该做些什么.
为了澄清上述情况,所有人都在说我们发送的任何电子邮件都要将有关该电子邮件的信息存储在文件的/ tmp/mail /目录下的文件夹中.
我想将DOM节点甚至整个序列化为windowJSON.
例如:
>> serialize(document)
-> {
"URL": "http://stackoverflow.com/posts/2303713",
"body": {
"aLink": "",
"attributes": [
"getNamedItem": "function getNamedItem() { [native code] }",
...
],
...
"ownerDocument": "#" // recursive link here
},
...
}
Run Code Online (Sandbox Code Playgroud)
JSON.stringify(window) // TypeError: Converting circular structure to JSON
Run Code Online (Sandbox Code Playgroud)
问题是JSON默认不支持循环引用.
var obj = {}
obj.me = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON
Run Code Online (Sandbox Code Playgroud)
window和DOM节点有很多.window === window.window将如此document.body.ownerDocument === document.
此外,JSON.stringify不序列化函数,所以这不是我想要的.
`dojox.json.ref.toJson()` can easily serialize object with …Run Code Online (Sandbox Code Playgroud) 我得到的错误是:
Type 'OrgPermission' in Assembly 'App_Code.ptjvczom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
我有一个gridview,它使用以下DataSource:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetOrgList"
TypeName="Org">
<SelectParameters>
<asp:SessionParameter Name="orgCodes" SessionField="UserOrgs" Type="Object" />
<asp:Parameter DefaultValue="Y" Name="active" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
Run Code Online (Sandbox Code Playgroud)
我在页面加载中设置会话变量,如下所示:
User cUser = new User(userid);
//make sure the user is an Admin
List<OrgPermission> orgs = new List<OrgPermission>();
foreach(OrgPermission org in cUser.orgs)
{
if (org.type=='admin')
{
orgs.Add(org);
}
}
Session["UserOrgs"] = orgs;
Run Code Online (Sandbox Code Playgroud)
我的用户类看起来像这样:
public class OrgPermission
{
public string Org { get; set; }
public List<string> …Run Code Online (Sandbox Code Playgroud)