简介:在使用JavaScriptSerializer.Deserialize时,如何将JSON数据中的字段名称映射到.Net对象的字段名称?
更长版本:我从服务器API(未在.Net中编码)向我发送以下JSON数据
{"user_id":1234, "detail_level":"low"}
Run Code Online (Sandbox Code Playgroud)
我有以下C#对象:
[Serializable]
public class DataObject
{
[XmlElement("user_id")]
public int UserId { get; set; }
[XmlElement("detail_level")]
public DetailLevel DetailLevel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
其中DetailLevel是一个枚举,其中"低"作为其中一个值.
此测试失败:
[TestMethod]
public void DataObjectSimpleParseTest()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
DataObject dataObject = serializer.Deserialize<DataObject>(JsonData);
Assert.IsNotNull(dataObject);
Assert.AreEqual(DetailLevel.Low, dataObject.DetailLevel);
Assert.AreEqual(1234, dataObject.UserId);
}
Run Code Online (Sandbox Code Playgroud)
最后两个断言失败,因为这些字段中没有数据.如果我将JSON数据更改为
{"userid":1234, "detaillevel":"low"}
Run Code Online (Sandbox Code Playgroud)
然后它通过.但我不能改变服务器的行为,我希望客户端类在C#语言中具有良好命名的属性.我不能使用LINQ to JSON,因为我希望它在Silverlight之外工作.看起来XmlElement标签没有任何效果.我不知道我在哪里知道它们是相关的,它们可能不是.
你如何在JavaScriptSerializer中进行字段名称映射?它可以完成吗?
所以我有一个表单,我使用jquery序列化函数通过ajax提交表单
serialized = $(Forms).serialize();
$.ajax({
type : "POST",
cache : false,
url : "blah",
data : serialized,
success: function(data) {
}
Run Code Online (Sandbox Code Playgroud)
但是如果表单有一个<input type="file">字段怎么办....如何使用这个ajax序列化方法将文件传递给表单...打印$ _FILES不输出任何内容
我试图在C#中序列化Exception对象.但是,似乎不可能,因为Exception类没有标记为[Serializable].有办法解决这个问题吗?
如果在执行应用程序期间出现问题,我希望被告知发生的异常.
我的第一反应是序列化它.
使用django-rest-framework 3.0并拥有以下简单模型:
class Book(models.Model):
title = models.CharField(max_length=50)
class Page(models.Model):
book = models.ForeignKey(Books, related_name='related_book')
text = models.CharField(max_length=500)
Run Code Online (Sandbox Code Playgroud)
并且给出了这个JSON请求:
{
"book_id":1,
"pages":[
{
"page_id":2,
"text":"loremipsum"
},
{
"page_id":4,
"text":"loremipsum"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何编写嵌套的序列化程序来处理此JSON,并为page给定的每个JSON book创建新页面或更新(如果存在).
class RequestSerializer(serializers.Serializer):
book_id = serializers.IntegerField()
page = PageSerializer(many=True)
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
Run Code Online (Sandbox Code Playgroud)
我知道用一个实例化序列化器instance会更新当前的序列化器,但我应该如何在create嵌套序列化器的方法中使用它?
在MySQL数据库与序列化数组中存储JSON数据有哪些优缺点?
我正在实现一个可序列化的类(所以它是一个使用w/RMI的值对象).但我需要测试它.有办法轻松做到这一点吗?
澄清:我正在实现这个类,所以在类定义中坚持使用Serializable是微不足道的.我需要手动序列化/反序列化它以查看它是否有效.
我发现了这个C#问题,Java有类似的答案吗?
我有一个JsonResult工作正常,并从一些POCO返回JSON.我想将JSON保存为DB中的字符串.
public JsonResult GetJSON()
{
JsonResult json = new JsonResult
{
Data = GetSomPocos()
};
return json;
}
Run Code Online (Sandbox Code Playgroud)
我需要审核响应,所以我想将其保存json到数据库中.我找不到将JSON作为字符串的方法.
任何帮助表示赞赏.
我一直在计划使用simpleXML来满足我的序列化需求,但我想我会尝试使用JSON来学习新的东西.
这是我用来尝试使用Gson 1.7.1序列化测试POJO的ArrayList的代码.
注意:我删除了字符串"s"的读/写器以简化代码.
package test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.gson.Gson;
public class TestGsonSerialDeserialList {
public static void main(String[] args) throws IOException{
Gson gson = new Gson();
//Make Serial
String s;
List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
list.add(new TestObject());
list.add(new TestObject());
s = gson.toJson(list, ArrayList.class);
System.out.println(s);
//Eat Serial
List<TestObject> list2 = Collections.synchronizedList(gson.fromJson(s, ArrayList.class) );
System.out.println(list2.get(0) );
System.out.println(list2.get(1) );
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
[{"objectID":1,"i1":12345,"name":"abcdefg","s":["a","b","c"]},{"objectID":2,"i1":12345,"name":"abcdefg","s":["a","b","c"]}]
java.lang.Object@5c74c3aa
java.lang.Object@75d9fd51
Run Code Online (Sandbox Code Playgroud)
对我的新手来说,这看起来是正确的.只有DeSerialized对象列表包含基本对象,而不是我序列化的TestObject.任何人都可以向我解释一下,如果有的话,我可以做些什么来使这项工作?
编辑:
更正测试:感谢ColinD
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; …Run Code Online (Sandbox Code Playgroud) 我试图理解Ruby中的JSON序列化格局.我是Ruby的新手.
如果您不使用Rails,是否有任何好的JSON序列化选项?
这似乎就是这个答案所针对的(对于Rails) 如何将Ruby对象转换为JSON
json gem看起来好像你必须编写自己的to_json方法.我无法让to_json处理数组和散列(文档说它适用于这些)是否有一个原因json gem不只是反映对象并使用默认的序列化策略?这不是如何to_yaml工作(猜测在这里)
我有一些数据,我必须序列化为JSON.我正在使用JSON.NET.我的代码结构与此类似:
public struct structA
{
public string Field1;
public structB Field2;
public structB Field3;
}
public struct structB
{
public string Subfield1;
public string Subfield2;
}
Run Code Online (Sandbox Code Playgroud)
问题是,我的JSON输出需要只有Field1OR Field2或Field3- 它取决于使用哪个字段(即不为空).默认情况下,我的JSON看起来像这样:
{
"Field1": null,
"Field2": {"Subfield1": "test1", "Subfield2": "test2"},
"Field3": {"Subfield1": null, "Subfield2": null},
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用NullValueHandling.Ignore,但这给了我看起来像这样的JSON:
{
"Field2": {"Subfield1": "test1", "Subfield2": "test2"},
"Field3": {}
}
Run Code Online (Sandbox Code Playgroud)
而我需要的是:
{
"Field2": {"Subfield1": "test1", "Subfield2": "test2"},
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来实现这一目标?