我有两种格式的JSON,我想反序列化为一个类.我知道我们不能将两个[JsonProperty]属性应用于一个属性.
你能告诉我一个实现这个目标的方法吗?
string json1 = @"
{
'field1': '123456789012345',
'specifications': {
'name1': 'HFE'
}
}";
string json2 = @"
{
'field1': '123456789012345',
'specifications': {
'name2': 'HFE'
}
}";
public class Specifications
{
[JsonProperty("name1")]
public string CodeModel { get; set; }
}
public class ClassToDeserialize
{
[JsonProperty("field1")]
public string Vin { get; set; }
[JsonProperty("specification")]
public Specifications Specifications { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望name1并且name2两者都要反序列化为name1规范类的属性.
我正在使用Codable带有JSON数据的Swift 4 协议.我的数据被格式化为在根级别有一个键,其中一个对象值包含我需要的属性,例如:
{
"user": {
"id": 1,
"username": "jdoe"
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个User可以解码user密钥的结构:
struct User: Codable {
let id: Int
let username: String
}
Run Code Online (Sandbox Code Playgroud)
由于id和username是的性质user,而不是在根级别,我需要使一个包装类型,如下所示:
struct UserWrapper: Codable {
let user: User
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过UserWrapper,解码JSON ,并User解码.它似乎是很多冗余代码,因为我需要在我拥有的每种类型上都有一个额外的包装器.有没有办法避免这种包装模式或更正确/优雅的方式来处理这种情况?
我想用Jackson反序列化JSON-Object.因为目标是一个接口,我需要指定应该使用哪个实现.
可以使用@JsonTypeInfo-Annotation将此信息存储在JSON-Object中.但是我想在源代码中指定实现,因为它始终是相同的.
这可能吗?
我想将JSON字符串转换为java对象,但此对象的类包含杰克逊无法实例化的抽象字段,并且不生成该对象.告诉它关于抽象类的一些默认实现的最简单方法是什么,比如
setDefault(AbstractAnimal.class, Cat.class);
Run Code Online (Sandbox Code Playgroud)
或者根据JSON属性名称来决定实现类,例如.对于JSON对象:
{
...
cat: {...}
...
}
Run Code Online (Sandbox Code Playgroud)
我愿意:
setImpl("cat", Cat.class);
Run Code Online (Sandbox Code Playgroud)
我知道Jackson可以在JSON中嵌入类信息,但我不想让我使用的JSON格式复杂化.我想通过设置默认实现类或属性名称('cat')来决定使用哪个类 - 就像在XStream库中一样,您可以在其中编写:
xStream.alias("cat", Cat.class);
Run Code Online (Sandbox Code Playgroud)
有没有办法这样做,特别是在一行中,还是需要更多的代码?
我有一个类,里面也有变量.有时我想忽略一些字段,有时候不反序列化(也许在序列化时).我怎么能在杰克逊这样做?
到目前为止,我已经使用了Json.Net的"JsonConvert.Deserialize(json)"方法,该方法运行得很好,说实话,我不需要更多的东西.
我正在开发一个后台(控制台)应用程序,它不断从不同的URL下载json内容,然后将结果反序列化为.Net对象列表.
using (WebClient client = new WebClient())
{
string json = client.DownloadString(stringUrl);
var result = JsonConvert.DeserializeObject<List<Contact>>(json);
}
Run Code Online (Sandbox Code Playgroud)
上面的简单代码片段似乎并不完美,但它可以完成这项工作.当文件很大(15000个联系人--48 MB文件)时,JsonConvert.DeserializeObject不是解决方案,并且该行抛出异常类型的JsonReaderException.
下载的json是一个数组,这就是样本的样子.Contact是反序列化的json对象的容器类.
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]
Run Code Online (Sandbox Code Playgroud)
我最初的猜测是内存不足.出于好奇,我试图将其解析为JArray,这也导致了同样的异常.
我已经开始深入研究Json.Net文档并阅读类似的线程.由于我还没有设法制作出有效的解决方案,我决定在这里发一个问题.
我很感激任何建议/代码片段,它可以帮助我研究问题,了解更多信息并最终找到解决方案.
谢谢 :)
更新:逐行反序列化时,我得到了同样的错误:"[.路径'',第600003行,第1位." 所以我做的是下载其中两个并在Notepad ++中检查它们.我注意到的是,如果数组长度超过12000,则在第12000个元素之后,"["关闭,另一个数组开始.换句话说,json看起来完全像这样:
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
} …Run Code Online (Sandbox Code Playgroud) kotlin 1.2.10 jackson-module-kotlin:2.9.0
我在kotlin中有以下数据类:
data class CurrencyInfo(
@JsonProperty("currency_info") var currencyInfo: CurrencyInfoItem?
)
@JsonInclude(JsonInclude.Include.NON_NULL)
data class CurrencyInfoItem(
@JsonProperty("iso_4217") var iso4217: String?,
@JsonProperty("name") var name: String?,
@JsonProperty("name_major") var nameMajor: String?,
@JsonProperty("name_minor") var nameMinor: String?,
@JsonProperty("i_ma_currency") var iMaCurrency: Int?,
@JsonProperty("i_merchant_account") var iMerchantAccount: Int?,
@JsonProperty("i_x_rate_source") var iXRateSource: Int?,
@JsonProperty("base_units") var baseUnits: Double?,
@JsonProperty("min_allowed_payment") var minAllowedPayment: Int?,
@JsonProperty("decimal_digits") var decimalDigits: Int?,
@JsonProperty("is_used") var isUsed: Boolean?
)
Run Code Online (Sandbox Code Playgroud)
当我尝试反序列化此数据类时,我得到以下内容:
{"currency_info":{"iso_4217":"CAD","name":"Canadian Dollar","imerchantAccount":0,"ixrateSource":2}}
Run Code Online (Sandbox Code Playgroud)
如您所见,最后两个选项被错误地反序列化.可以通过直接向getter @get:JsonProperty添加注释来解决此问题.但是,根据jackson docs @JsonProperty应该分配给getter/setters/fields
所以,我想问一下是否有一种可靠的方法来为kotlin中的jackson注释属性以进行正确的序列化/反序列化(而且我的所有数据类都是自动生成的,因此很难创建一些两/三行注释,分别用于getter和二传手)
否则,一些杰克逊设置可以解决这个问题吗?
根据下面的答案,以下为我工作
private val mapper = ObjectMapper().registerKotlinModule()
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE) …Run Code Online (Sandbox Code Playgroud) 这看起来应该很容易,但是当我尝试将一些简单的JSON 反序列化为托管类型时,我遇到了异常.例外是:
MissingMethodException
没有为'System.String'类型定义的无参数构造函数
虽然System.String没有无参数构造函数,但我不清楚为什么这很重要.
执行反序列化的代码是:
using System.Web.Script.Serialization;
private static JavaScriptSerializer serializer = new JavaScriptSerializer();
public static MyType Deserialize(string json)
{
return serializer.Deserialize<MyType>(json);
}
Run Code Online (Sandbox Code Playgroud)
我的类型大致是:
public class MyType
{
public string id { get; set; }
public string type { get; set; }
public List<Double> location { get; set; }
public Address address { get; set; }
public Dictionary<string, string> localizedStrings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
另一个类是一个地址:
public class Address
{
public string addressLine { get; set; …Run Code Online (Sandbox Code Playgroud) 我创建客户端和服务器,然后在添加客户端类的序列化的目的,然后简单地刚走到客户在我的硬盘驱动器的文件夹,并将其粘贴到服务器correponding位置,都classname.class和classname.java分别.
它在我自己的笔记本电脑上运行良好但是当我想继续我在其他系统上工作时,当我打开项目文件夹并在客户端尝试连接到服务器后,出现以下错误:
Exception in thread "main" java.io.InvalidClassException: projectname.clasname; local class incompatible: stream classdesc serialVersionUID = -6009442170907349114, local class serialVersionUID = 6529685098267757690
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?是因为我使用较旧版本的IDE运行程序?
import java.io.Serializable;
import java.net.URL;
public class KeyAdr implements Serializable {
private static final long serialVersionUID = 6529685098267757690L;
public URL adr;
public String key;
}
Run Code Online (Sandbox Code Playgroud) 我有一个JSON字符串,我需要一些帮助来反序列化它.
没有什么对我有用..这是JSON
{
"response": [{
"loopa": "81ED1A646S894309CA1746FD6B57E5BB46EC18D1FAff",
"drupa": "D4492C3CCE7D6F839B2BASD2F08577F89A27B4ff",
"images": [{
"report": {
"nemo": "unknown"
},
"status": "rock",
"id": "7e6ffe36e-8789e-4c235-87044-56378f08m30df",
"market": 1
},
{
"report": {
"nemo": "unknown"
},
"status": "rock",
"id": "e50e99df3-59563-45673-afj79e-e3f47504sb55e2",
"market": 1
}
]
}]
}
Run Code Online (Sandbox Code Playgroud)
我有一个类的例子,但我不必使用这些类,我不介意使用其他类.这些是类:
public class Report
{
public string nemo { get; set; }
}
public class Image
{
public Report report { get; set; }
public string status { get; set; }
public string id { get; set; }
public int market …Run Code Online (Sandbox Code Playgroud)