Reputation: 96
Ive got a class Limits
. I am creating several instances of this class as I have other objects that each need a their own Limits
. So when I am serializing all instances of Limits there are several entries in the json. In my example you will see I have Thermo
. Imagine there could be Thermo1
, Thermo2
etc all in the json. I deserialise it, navigate to the instance I want and then convert it to Limits
. But for some reason all Min
& Max
values end up being 0.
The class:
public class Limits
{
Measured_I_ON_struct Measured_I_ON;
Measured_I_OFF_struct Measured_I_OFF;
Measured_V_ON_struct Measured_V_ON;
Measured_V_OFF_struct Measured_V_OFF;
public Limits()
{
Measured_I_ON = new Measured_I_ON_struct();
Measured_I_OFF = new Measured_I_OFF_struct();
Measured_V_ON = new Measured_V_ON_struct();
Measured_V_OFF = new Measured_V_OFF_struct();
}
public struct Measured_I_ON_struct
{
public double Min;
public double Max;
}
public struct Measured_I_OFF_struct
{
public double Min;
public double Max;
}
public struct Measured_V_ON_struct
{
public double Min;
public double Max;
}
public struct Measured_V_OFF_struct
{
public double Min;
public double Max;
}
}
I have a json as such :
{"Thermo":{
"Measured_V_ON":
{
"Min" : 4.5,
"Max" : 5.5
},
"Measured_V_OFF": {
"Min" : 4.5,
"Max" : 5.5
},
"Measured_I_ON": {
"Min" : 4.5,
"Max" : 5.5
},
"Measured_I_OFF": {
"Min" : 0.15,
"Max" : 0.22
},
}
}
I am trying to deserialise the json back to an instance of the class Limits but the values inside each struct come out as 0.
string json = File.ReadAllText("new 2.json");
JToken jsonobject = JsonConvert.DeserializeObject<JToken>(json);
jsonobject = jsonobject["Thermo"];
Limits limits = new Limits();
limits = jsonobject.ToObject<Limits>();
Everything inside limits has a value of 0. What am i missing here?
Upvotes: 0
Views: 162
Reputation: 667
Download the Newtonsoft.Json Nuget package. It's very handy on Json parsing with C#. You can write as below.
string json = File.ReadAllText("new2.json");
var jsonobject = JObject.Parse(json);
var jsonBody = jsonobject["Thermo"].ToString();
LimitsRoot limitsRoot = new LimitsRoot();
limitsRoot = JsonConvert.DeserializeObject<LimitsRoot>(jsonBody);
LimitsRoot related classes will look as below
public class MeasuredVON
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredVOFF
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredION
{
public double Min { get; set; }
public double Max { get; set; }
}
public class MeasuredIOFF
{
public double Min { get; set; }
public double Max { get; set; }
}
public class LimitsRoot
{
public MeasuredVON Measured_V_ON { get; set; }
public MeasuredVOFF Measured_V_OFF { get; set; }
public MeasuredION Measured_I_ON { get; set; }
public MeasuredIOFF Measured_I_OFF { get; set; }
}
Then you can check by running you will get value correctly as below
limitsRoot.Measured_V_ON.Min
4.5
Upvotes: 0
Reputation: 1503280
Your fields are private, which is why they're not being changed.
I would change your code significantly though:
Limits
rather than private fields[JsonProperty]
to specify the name you want in the JSON.So something like this:
public class Limit
{
public double Min { get; set; }
public double Max { get; set; }
}
public class Limits
{
// TODO: Rename these further to expand on "I" and "V" if possible
[JsonProperty("Measured_I_ON")]
public Limit MeasuredIOn { get; set; } = new Limit();
[JsonProperty("Measured_I_OFF")]
public Limit MeasuredIOff { get; set; } = new Limit();
[JsonProperty("Measured_V_ON")]
public Limit MeasuredVOn { get; set; } = new Limit();
[JsonProperty("Measured_V_OFF")]
public Limit MeasuredVOff { get; set; } = new Limit();
}
Upvotes: 2