我试图在Spring中编写自定义JSON反序列化器.我想在大多数字段中使用默认序列化程序,并为少数属性使用自定义反序列化程序.可能吗?我这样做是因为,大部分属性都是值,所以对于这些我可以让杰克逊使用默认的反序列化器; 但很少有属性是引用,所以在自定义反序列化器中,我必须查询数据库以获取引用名称并从数据库中获取引用值.
如果需要,我会展示一些代码.
我想知道@JsonTypeInfo注释是否可以用于接口.我有一组应该序列化和反序列化的类.
这就是我想要做的.我有两个实现类Sub1,Sub2实现MyInt.某些模型类具有实现类型的接口参考.我想基于多态来反序列化对象
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT)
@JsonSubTypes({
@Type(name="sub1", value=Sub1.class),
@Type(name="sub2", value=Sub2.class)})
public interface MyInt{
}
@JsonTypeName("sub1")
public Sub1 implements MyInt{
}
@JsonTypeName("sub2")
public Sub2 implements MyInt{
}
Run Code Online (Sandbox Code Playgroud)
我得到以下内容JsonMappingException:
意外的令牌(END_OBJECT),预期的FIELD_NAME:需要包含类型ID的JSON字符串
这是代码:
string s = "2012-08-08T01:54:45.3042880+00:00";
JObject j1 = JObject.FromObject(new
{
time=s
});
Object o = j1["time"];
Run Code Online (Sandbox Code Playgroud)
我们可以检查o是否为字符串并等于"2012-08-08T01:54:45.3042880 + 00:00"
现在我们将j1.ToString()转移到另一个程序,即
{
"time": "2012-08-08T01:54:45.3042880+00:00"
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个程序中,尝试将其解析回JObject,即
JObject j2 = JObject.Parse(j1.ToString());
Object o2 = j2["time"];
Run Code Online (Sandbox Code Playgroud)
现在,如果我们检查o2,o2的类型是Date,o2.ToString()是8/7/2012 9:54:45 PM.
我的问题是:
有没有办法禁用JObject.Parse的日期反序列化,只是获取原始字符串?
提前致谢
在C#中,如何在序列化期间使XmlSerializer忽略属性,而不是在反序列化期间忽略属性?(或者我如何对Json.net做同样的事情?)
要阻止属性序列化,可以添加XmlIgnore属性:
[XmlIgnore]
public int FooBar {get;set;}
Run Code Online (Sandbox Code Playgroud)
这将导致<FooBar>在序列化期间省略标记.
但是,这也意味着<FooBar>在反序列化期间将忽略标记.
在我的例子中,我在请求中接受来自用户的一系列项目,并且对于每个项目,如果用户想要添加,修改或删除项目,则可以指定动作属性.我想为GET列表调用使用相同的模型对象,并且不想返回此action属性.我希望这是一个很常见的情况.
另一个用例:说你有一个圆形对象
public class Circle
{
public double Radius { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并修改它以添加直径属性
public class Circle2
{
public double Diameter { get; set; }
public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
}
Run Code Online (Sandbox Code Playgroud)
您可能只想序列化直径,但仍能够以旧格式反序列化仅包含半径的xml文件.
我做了我的研究并没有找到任何东西,因此这个问题
解决方案:我找到了解决方案.我可以在此MSDN文档中添加一个始终返回false的ShouldSerialize属性
(如果重新打开此问题,可以将此解决方案添加为实际答案)
我有一个Java类,用户:
public class User
{
int id;
String name;
Timestamp updateDate;
}
Run Code Online (Sandbox Code Playgroud)
我收到一个包含来自Web服务的用户对象的JSON列表:
[{"id":1,"name":"Jonas","update_date":"1300962900226"},
{"id":5,"name":"Test","date_date":"1304782298024"}]
Run Code Online (Sandbox Code Playgroud)
我试图编写一个自定义反序列化器:
@Override
public User deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
return new User(
json.getAsJsonPrimitive().getAsInt(),
json.getAsString(),
json.getAsInt(),
(Timestamp)context.deserialize(json.getAsJsonPrimitive(),
Timestamp.class));
}
Run Code Online (Sandbox Code Playgroud)
但我的解串器不起作用.如何为Gson编写自定义JSON反序列化器?
是否可以将未知XML反序列化为对象,如下所示?
var xml = @"<Students><Student><Name>Arul</Name><Mark>90</Mark></Student></Students>";
var serializer = new XmlSerializer(typeof(DynamicObject));
dynamic students = serializer.Deserialize(new XmlTextReader(new StringReader(xml)));
Run Code Online (Sandbox Code Playgroud) 我在Android应用程序中实现Json反序列化时遇到一些问题(使用Gson库)
我上过这样的课
public class MyJson<T>{
public List<T> posts;
}
Run Code Online (Sandbox Code Playgroud)
反序列化调用是:
public class JsonDownloader<T> extends AsyncTask<Void, Void, MyJson<T>> {
...
protected MyJson<T> doInBackground(Void... params) {
...
Reader reader = new InputStreamReader(content);
GsonBuilder gson = new GsonBuilder();
Type collectionType = new TypeToken<MyJson<T>>() {}.getType();
result = gson.create().fromJson(reader, collectionType);
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象.当我使用MyObject而不是T时,一切正常,MyObject正确.
那么有没有办法在不创建自定义反序列化器的情况下实现反序列化调用?
我正在使用Gson读取JSON响应,它返回somtimes a NumberFormatException因为预期int值设置为空字符串.现在我想知道处理这种异常的最佳方法是什么.如果值为空字符串,则反序列化应为0.
预期的JSON响应:
{
"name" : "Test1",
"runtime" : 90
}
Run Code Online (Sandbox Code Playgroud)
但有时运行时是一个空字符串:
{
"name" : "Test2",
"runtime" : ""
}
Run Code Online (Sandbox Code Playgroud)
java类看起来像这样:
public class Foo
{
private String name;
private int runtime;
}
Run Code Online (Sandbox Code Playgroud)
反序列化是这样的:
String input = "{\n" +
" \"name\" : \"Test\",\n" +
" \"runtime\" : \"\"\n" +
"}";
Gson gson = new Gson();
Foo foo = gson.fromJson(input, Foo.class);
Run Code Online (Sandbox Code Playgroud)
抛出一个com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String因为返回一个空String而不是一个int值.
有没有办法告诉Gson," 如果你反序列化runtimeType 的字段Foo并且有一个NumberFormatException,只返回默认值0 "?
我的解决方法是使用a …
有些代码(我无法更改)使用Newtonsoft.Json DeserializeObject<T>(strJSONData)从Web请求中获取数据并将其转换为类对象(我可以更改类).通过使用我的类属性进行装饰,[DataMember(Name = "raw_property_name")]我可以将原始JSON数据映射到我的类中的正确属性.有没有办法可以将JSON复杂对象的子属性映射到一个简单的属性?这是一个例子:
{
"picture":
{
"id": 123456,
"data":
{
"type": "jpg",
"url": "http://www.someplace.com/mypicture.jpg"
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了URL之外,我不关心任何其他图片对象,因此不想在我的C#类中设置复杂对象.我真的只想要这样的东西:
[DataMember(Name = "picture.data.url")]
public string ProfilePicture { get; set; }
Run Code Online (Sandbox Code Playgroud)
这可能吗?
假设我有一个Java Person类:
class Person {
String name;
String email;
}
Run Code Online (Sandbox Code Playgroud)
使用REST Assured,您可以反序列化此JSON对象
{"name":"Bob", "email":"bob@email.com"}
Run Code Online (Sandbox Code Playgroud)
使用的Java Person实例
Person bob = given().when().get("person/Bob/").as(Person.class);
Run Code Online (Sandbox Code Playgroud)
如何使用REST Assured反序列化此JSON数组
[{"name":"Bob", "email":"bob@email.com"},
{"name":"Alice", "email":"alice@email.com"},
{"name":"Jay", "email":"jay@email.com"}]
Run Code Online (Sandbox Code Playgroud)
变成了List<Person>?例如,这将是方便的:
List<Person> persons = given().when().get("person/").as(...);
Run Code Online (Sandbox Code Playgroud)