我想反序列化JSON为对象,但我不想反序列化嵌套的JSON,嵌套的嵌套JSON应该转换为JSON列表(请检查“ 我的预期输出
”以获得清晰的主意)…
//假设我下面有JSON数据,在这里我为“地址”实体嵌套了JSON
String jsonEmployees =
"{"Employees":
[{"EmpId":1, "EmpName":"ABC", "Address":[{"AddressId":1, "Address":"Something"},{"AddressId":2, "Address":"Anything"}]},
{"EmpId":2, "EmpName":"XYZ", "Address":[{"AddressId":1, "Address":"Something"},{"AddressId":2, "Address":"Anything"}]}]
}"
public class Employee
{
public int EmpId { get; set; }
public string EmpName { get; set; }
// **Note** : I'm not using List<Address> data type for Address, instead of I want list of address in JSON string
public string Address { get; set; }
}
public class RootObject
{
public List<Employee> Employees { get; set; }
}
var Employees = JsonConvert.DeserializeObject<RootObject>(jsonEmployees);
//我的预期输出
Employees[0].EmpId = 1;
Employees[0].EmpName = "ABC";
Employees[0].Address = "[{"AddressId":1, "Address":"Something"},{"AddressId":2, "Address":"Anything"}]";
Employees[1].EmpId = 2;
Employees[1].EmpName = "XYZ";
Employees[1].Address = "[{"AddressId":1, "Address":"Something"},{"AddressId":2, "Address":"Anything"}]";
请建议我解决此问题的最佳方法…
您的问题是, 如何 在不转义JSON的情况下 , 如何使用string
包含“原始” JSON 的成员对类型进行序列化和反序列化?
这可以通过做自定义JsonConverter
读取和写入使用原始JSON
JsonWriter.WriteRawValue()
和JRaw.Create()
:
public class RawConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var raw = JRaw.Create(reader);
return raw.ToString();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var s = (string)value;
writer.WriteRawValue(s);
}
}
然后将其应用于您的类型,如下所示:
public class Employee
{
public int EmpId { get; set; }
public string EmpName { get; set; }
// **Note** : I'm not using List<Address> data type for Address, instead of I want list of address in JSON string
[JsonConverter(typeof(RawConverter))]
public string Address { get; set; }
}
public class RootObject
{
public List<Employee> Employees { get; set; }
}
样品提琴。
请注意,原始JSON字符串 必须
代表有效的JSON。如果不是,则创建的JSON将不可读。如果要保证JSON文字有效,则可以在内部将JSON保持为已解析状态:
public class Employee
{
public int EmpId { get; set; }
public string EmpName { get; set; }
[JsonProperty("Address")]
JToken AddressToken { get; set; }
[JsonIgnore]
public string Address
{
get
{
if (AddressToken == null)
return null;
return AddressToken.ToString(Formatting.Indented); // Or Formatting.None if you prefer
}
set
{
if (value == null)
AddressToken = null;
else
// Throw an exception if value is not valid JSON.
AddressToken = JToken.Parse(value);
}
}
}
此实现不需要转换器。
问题内容: 我有一个iOS应用程序,需要处理来自Web服务的响应。响应是包含序列化JSON对象的序列化JSON字符串,如下所示: 请注意,此响应是JSON 字符串 ,而不是JSON对象。我需要做的是将字符串反序列化,这样我就可以得到: 然后我可以用来反序列化为。 但是,我该如何第一步?也就是说,如何“解串”字符串,以便拥有序列化的JSON对象? 仅当顶级对象是数组或字典时才有效;它不适用于字符串。
问题内容: 我有一个发送到服务器或从服务器发送的用户对象。发送用户对象时,我不想将哈希密码发送给客户端。因此,我添加了password属性,但这也阻止了将其反序列化为密码,这使得在没有密码的情况下很难注册用户。 我怎样才能只应用序列化而不是反序列化?我使用的是Spring JSONView,因此对的控制不多。 我尝试过的事情: 添加到属性 仅添加getter方法 问题答案: 确切的操作方法取决于你
问题内容: 我有数据类/表“ User”,其中有“ preferences”列 首选项类型为TEXT,我在其中存储JSON。 所以价值是 如何使用一些注释将其包装起来,以便像 或无需包装到数据对象中 我想可能会有一些Jackson注释可以添加到字段中,例如 我对JPA相当陌生,文档非常丰富。 我相信我的情况很普遍。谁能举任何例子? 问题答案: 老实说,我认为最好的解决方案是为属性创建一个单独的表(
我有一个用户对象,它被发送到服务器和从服务器发送。当我发出user对象时,我不想将散列密码发送给客户端。因此,我在password属性中添加了,但这也阻止了它反序列化为密码,这使得用户在没有密码时很难注册。 如何才能只让应用于序列化而不应用于反序列化?我使用的是Spring JSONView,所以我对没有太多的控制权。 将添加到属性 仅在getter方法上添加
使用杰克逊( 数据: 数据模型: 我当前的反序列化器如下所示: 注意:我的问题被定义为Scala,但我认为Java的方法足够相似,以至于无关紧要。所以Java的答案是可以接受的。
问题内容: 我有一个发送到服务器或从服务器发送的用户对象。发送用户对象时,我不想将哈希密码发送给客户端。因此,我添加了password属性,但这也阻止了将其反序列化为密码,这使得在没有密码的情况下很难注册用户。 我怎样才能只应用序列化而不是反序列化?我使用的是Spring JSONView,因此对的控制不多。 我尝试过的事情: 添加到属性 仅添加getter方法 问题答案: 确切的操作方法取决于你