如果您对Gson反序列化生成NULL值和gson自定义反序列化感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Gson反序列化生成NULL值的各种细节,并对gson自定义反序列化进行深入的分析,
如果您对Gson反序列化生成NULL值和gson自定义反序列化感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Gson反序列化生成NULL值的各种细节,并对gson自定义反序列化进行深入的分析,此外还有关于android – GSON反序列化自定义对象数组、android – 使用Gson将Json反序列化为单例、c# json 序列化如何去掉null值、C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员的实用技巧。
本文目录一览:- Gson反序列化生成NULL值(gson自定义反序列化)
- android – GSON反序列化自定义对象数组
- android – 使用Gson将Json反序列化为单例
- c# json 序列化如何去掉null值
- C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员
Gson反序列化生成NULL值(gson自定义反序列化)
我试图读取JSON文件并将其转换为数组,但是在读取JSON文件后从数组获取空值。我正在为我的ShipDetail
班级使用默认构造函数。
BufferedReader detailReader = new BufferedReader( new FileReader(shipDetails)); // Buffered passed to convert json array to java array ShipDetail[] shipDetail = gson.fromJson(detailReader, ShipDetail[].class ); System.out.println( shipDetail[0].toString()); // Convert array to arrayList ArrayList<ShipDetail> detailArray = new ArrayList<ShipDetail>(Arrays.asList(shipDetail));
JSON文件:
[ { "idmessage":"27301", "idsession":"362", "time_stamp_system":"2017-01-20 14:51:14", "NMEA_string":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "processed":"1", "MMSI":"0000000001", "AIS_version":"0", "IMO_number":"xxxxxxxxxx", "callSign":"ODLK1", "name":"ODLXJ KWW", "type_of_ship_and_cargo":"0", "bow_to_possition_unit":"212", "stern_to_possition_unit":"71", "port_to_possition_unit":"22", "starboard_to_possitio_unit":"22", "type_of_position_fixing_divice":"1", "ETA":null, "destination":"", "last_static_draught":"0", "DTE":"127" }]
本ShipDetail
类:
public class ShipDetail { private String IdMessage, IdSession, Time_Stamp_System, Nmea_String, Processed; private String Mmsi, Ais_Version, Imo_Number, Callsign, Name, Type_Of_Ship_And_Cargo; private String Bow_To_Position_Unit, Stern_To_Position_Unit, Port_To_Position_Unit, Starboard_To_Position_Unit, Type_Of_Position_Fixing_Device; private String Eta, Destination, Last_Ship_Draught, Dte; public String getMmsi() { return Mmsi; } public String toString() { return "\n Id Message : " + IdMessage + "\n Id Session : " + IdSession + "\n Time Stam System : " + Time_Stamp_System + "\n NMEA String : " + Nmea_String + "\n Processed : " + Processed + "\n MMSI : " + Mmsi + "\n AIS Version : " + Ais_Version + "\n IMO Number : " + Imo_Number + "\n Call Sign : " + Callsign + "\n Name : " + Name + "\n Type Of Ship And Cargo : " + Type_Of_Ship_And_Cargo + "\n Bow To Position Unit : " + Bow_To_Position_Unit + "\n Stern To Position Unit : " + Stern_To_Position_Unit + "\n Port To Position Unit : " + Port_To_Position_Unit + "\n Starboard To Position Fixing Device : " + Starboard_To_Position_Unit + "\n Type Of Position Fixing Device : " + Type_Of_Position_Fixing_Device + "\n ETA : " + Eta + "\n Destination : " + Destination + "\n Last Ship Draught : " + Last_Ship_Draught + "\n DTE : " + Dte; }}
答案1
小编典典您的Gson映射与给定的JSON不匹配。默认情况下,Gson通过 确切 名称将JSON属性映射到目标映射中的相应字段。看一眼:
"idmessage":"27301"
和
private String IdMessage
属性名称大小写和字段名称大小写不匹配。您需要的是正确映射JSON。要么:
private String idmessage
或通过覆盖名称匹配(这更适合Java命名约定):
@SerializedName("idmessage")private String idMessage;
注意每行一个字段。为了分别注释每个字段,这是必需的。或者,如果可能,在Java和JSON中同时使用camelCase。
android – GSON反序列化自定义对象数组
public class Session { @Serializedname("name") private String _name; @Serializedname("users") private ArrayList<User> _users = new ArrayList<User>(); }
和:
public class User { @Serializedname("name") private String _name; @Serializedname("role") private int _role; }
我正在使用GSON来序列化/反序列化数据.我像这样序列化:
Gson gson = new Gson(); String sessionjson = gson.toJson(session);
这将生成如下所示的JSON:
{ "name":"hi","users": [{"name":"John","role":2}] }
我这样反序列化:
Gson gson = new Gson(); Session session = gson.fromJson(jsonString,Session.class);
我打电话的时候收到错误.
DEBUG/dalvikvm(739): wrong object type: Ljava/util/LinkedList; Ljava/util/ArrayList; WARN/System.err(739): java.lang.IllegalArgumentException: invalid value for field
我不知道这个错误意味着什么.我不认为自己做了任何严重的错误.有帮助吗?谢谢!
解决方法
public class Session { @Serializedname("name") private String _name; @Serializedname("users") private List<User> _users = new ArrayList<User>(); }
使用Interfaces是一个很好的做法,GSON要求(至少没有额外的配置).
Gson将javascript中的数组“[]”转换为LinkedList对象.
在您的代码中,GSON尝试在_users字段中注入一个LinkedList,并认为该字段是一个List.
android – 使用Gson将Json反序列化为单例
现在,当Gson创建这个类的实例时,我正以非常规的方式创建单例实例.见下文:
public class ApplicationModel { private static ApplicationModel instance; private GeneralVO general; protected ApplicationModel() { instance = this; } public static ApplicationModel getInstance() { return instance; } public String getVersionDate() { return general.getVersionDate(); } }
这是我创建它然后在应用程序中重用它的方式:
InputStreamReader reader = new InputStreamReader(is); ApplicationModel model1 = new Gson().fromJson(reader,ApplicationModel.class); Log.i("mytag","InputStream1 = "+model1.toString()); Log.i("mytag","Date: "+model1.getVersionDate()); ApplicationModel model2 = ApplicationModel.getInstance(); Log.i("mytag","InputStream1 = "+model2.toString()); Log.i("mytag","Date: "+model2.getVersionDate());
这有效,因为getInstance()返回相同的模型,但不知何故,这似乎不正确.
我的问题是“这是一个很好的办法,还是有更好的解决方案?”
编辑
做单例的更好方法是使用带有一个INSTANCE元素的枚举.
See this post for an explanation
解决方法
public class ApplicationModel { private static ApplicationModel instance; //= new ApplicationModel(); //instantiating here is called an "Eagerly Instantiated" private GeneralVO general; private ApplicationModel() { } public static ApplicationModel getInstance() { //instantiating here is called "Lazily Instantiated",using : //if (instance==null) { --> Check whether ''instance'' is instantiated,or null // instance = new ApplicationModel(); --> Instantiate if null //} return instance; //return the single static instance } public String getVersionDate() { return general.getVersionDate(); } }
通过将构造函数设置为private,可以防止对象被另一个类重新实例化,要使用该对象,您必须使用ApplicationModel.getInstance()调用该对象.
因此,如果要设置值,请调用ApplicationModel.getInstance().setterMethod(value),为什么这有用?如果要跟踪更改,则只需跟踪setter方法.如果使用了构造函数,则还必须跟踪构造函数.
示例:
// To SET the value: // instead of ApplicationModel model1 = new Gson().fromJson(reader,ApplicationModel.class); ApplicationModel.getInstance.setValue(new Gson().fromJson(reader,ApplicationModel.class); // To GET the value : ApplicationModel.getInstance.getValue();
“渴望实例化”与“懒惰实例化”:
>如果您想要一种简单的方法来处理,那么Eager Instantiation非常有用
主题
> Lazy Instantiation具有更好的内存占用
除此之外,您可以谷歌搜索更多信息,但我认为这对您来说应该已经足够了.
希望这有帮助,祝你好运^^
问候,
里德
c# json 序列化如何去掉null值
要将一个对象序列化,可是如果对象的属性为null的时候,我们想将属性为null的都去掉。
在这里我使用Newtonsoft.Json.dll
记录一下序列化以及反序列化
json字符串转对象
Model model=JsonConvert.DeserializeObject<Model>(val);
将对象转化为json格式字符串
string jsonString = JsonConvert.SerializeObject(obj);
那么如何序列化为json时过滤掉NULL呢??
var jsonSetting = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};
var json = JsonConvert.SerializeObject(data, Formatting.Indented, jsonSetting);
直接这样JsonConvert.SerializeObject(obj);序列化结果

"MemberQuery": {
"PhoneNumber": "13222222222",
"Name": "test",
"MF": "女",
"BirthDate": "01/01/2017",
"MaritalStatus": null,
"Country": null
}

过滤掉NULL序列化结果:

"MemberQuery": {
"PhoneNumber": "13222222222",
"Name": "test",
"MF": "女",
"BirthDate": "01/01/2017"
}

以前需要将一段json字符串转换为C#对象时,一般都是定义一个与之对应的实体类来接收。这样做有一个很大的缺点,就是当字符串特别长,属性特别多,又有嵌套时,手敲这个实体类就非常痛苦。
比如之前做的一个接收百度七天天气预报的API,层层嵌套,很痛苦。
C# 4.0 之后有了动态类型dynamic。用这个东西配合Json.net可以实现不用定义实体类的json转dynamic类型对象。
以下示例需要先引用Newtonsoft.Json.dll


public class Person {
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Id = 1;
p.Name = "刘备";
//C#对象转Json
string json = JsonConvert.SerializeObject(p);
Console.WriteLine(json); //{"Id":1,"Name":"刘备"}
//此处模拟在不建实体类的情况下,反转将json返回dynamic对象
var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(DynamicObject.Name); //刘备
Console.ReadKey();
}
}


以上只是借用了一个实体类来获得一个简单的JSON对象。
实际上,可以完全没有这个Person类。


static void Main(string[] args)
{
string json = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"22\"}";
//此处模拟在不建实体类的情况下,反转将json返回回dynamic对象
var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(DynamicObject.Name); //刘备
Console.ReadKey();
}


如果未引用Microsoft.CSharp.dll,关于动态类型,VS可能会报错。
VS 可以回编译报错:找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员
背景今天在使用:c# json 序列化与反序列化
反序列化的时候出现了下面的错误信息。
System.Runtime.Serialization.SerializationException: 数据协定类型“TestEntity”无法反序列化,因为未找到必需的数据成员“multipleChoice, runTimeDisplayColumns”。 在 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
具体原因是:我在反序列化的实体类中新加了两个属性:
private bool multipleChoice; /// <summary> /// 帮助引擎是否允许多选 /// </summary> [XmlIgnore] [Browsable(false)] public bool MultipleChoice { get { return multipleChoice; } set { multipleChoice = value; } } private string runTimeDisplayColumns; /// <summary> /// 帮助引擎运行时显示的列 /// </summary> [XmlIgnore] [Browsable(false)] public string RunTimeDisplayColumns { get { return runTimeDisplayColumns; } set { runTimeDisplayColumns = value; } }
在使用之前保存的Json串反序列化的时候,新增的两个两个属性,没有对应的值,所以报出了上面的错误。
解决方法:
[DataContract] public class TestEntity { private bool multipleChoice; /// <summary> /// 帮助引擎是否允许多选 /// </summary> [XmlIgnore] [Browsable(false)] [DataMember(IsRequired = false)] public bool MultipleChoice { get { return multipleChoice; } set { multipleChoice = value; } } private string runTimeDisplayColumns; /// <summary> /// 帮助引擎运行时显示的列 /// </summary> [XmlIgnore] [Browsable(false)] [DataMember(IsRequired = false)] public string RunTimeDisplayColumns { get { return runTimeDisplayColumns; } set { runTimeDisplayColumns = value; } } }
通过DataMember(IsRequired = false)属性表面此属性,不是必须的。这样的话,保证了在反序列化的时候,即使JSON串内缺少该属性的定义能正常反序列化。
小注:
在属性上添加DataMember(IsRequired = false)后,对应的类上必须添加 [DataContract]标识。
以上就是以上就是的内容。的内容。
关于Gson反序列化生成NULL值和gson自定义反序列化的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – GSON反序列化自定义对象数组、android – 使用Gson将Json反序列化为单例、c# json 序列化如何去掉null值、C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员的相关知识,请在本站寻找。
本文标签: