GVKun编程网logo

Gson反序列化生成NULL值(gson自定义反序列化)

15

如果您对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自定义反序列化)

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反序列化自定义对象数组

android – GSON反序列化自定义对象数组

我正在尝试使用GSON在 Android中序列化/反序列化JSON.我有两个类看起来像这样:
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反序列化为单例

android – 使用Gson将Json反序列化为单例

我正在使用Gson将Json反序列化为模型ApplicationModel.我希望这个模型是一个单例,所以我可以在我的应用程序的其他地方访问它.

现在,当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

解决方法

我建议在Model上实例化你的单例实例,而不是使用构造函数实例化它.

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值

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反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员

背景今天在使用: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反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员的相关知识,请在本站寻找。

本文标签: