You are creating a program that uses values read from json where the array is defined.
If you deserialize the example json file in the following class, it will be 0 if it is not listed, so if you write 0 as a value, you will not be able to determine it.
using System.text.Json;
internal class value
{
public int front {get;set;}
public int back {get;set;}
}
Example json file
[
{
"Front": 2000,
"Back": 2000,
},
{
"Back": 3000,
},
{
"Front"—0,
}
]
It depends on what you use for JSON parsers, but in general, null tolerance type can be used to determine whether it is null or not.
Specifically, try changing it as follows:
internal class value
{
public int?front {get;set;}
public int? Back {get;set;}
}
I don't know what the de-serializer I'm using, but if I use System.Text.Json or Newtonsoft.Json, I'm not sure.
Use previously listed values if properties are not listed in the json file
I don't know what the "previously listed value" in is, but if you use the value of the element immediately preceding the array, you can do the following on condition that you do not change the definition of the Value class: .NET 6.0 console app.
# nullable disable
using System.Text.Json;
using Newtonsoft.Json;
usingNewtonsoft.Json.Linq;
US>//#string json=@"[
{
Front: 2000,
"Back": 2000,
},
{
"Back": 3000,
},
{
"Front" : 0,
},
{
"Front": 555,
"Back":666,
},
{
}
]";
// System.Text.Json
JsonElement jsonElement=System.Text.Json.JsonSerializer.Deserialize<JsonElement>(json,
new JsonSerializerOptions
{
AllowTrailingCommas=true
});
List<Value>list1 = new List<Value>();;
if(jsonElement.ValueKind==JsonValueKind.Array)
{
int prevFront=-1;
int prevBack=-1;
bool isFrontSet, isBackSet;
foreach(JsonElementjeremInArray in jsonElement.EnumerateArray())
{
if(jeremInArray.ValueKind==JsonValueKind.Object)
{
value = new Value();
isFrontSet=false;
isBackSet=false;
foreach(JsonProperty jprop in jelemInArray.EnumerateObject())
{
if(jprop.Name=="Front")
{
value.Front=prevFront=jprop.Value.GetInt32();
isFrontSet = true;
}
if(jprop.Name=="Back")
{
value.Back=prevBack=jprop.Value.GetInt32();
isBackSet = true;
}
}
if(isFrontSet==false)
{
value.Front=prevFront;
isFrontSet = true;
}
if(isBackSet==false)
{
value.Back =prevBack;
isBackSet = true;
}
list1.Add(value);
}
}
}
// Newtonsoft.Json
JToken jtoken=JsonConvert.DeserializeObject<JToken>(json);
List<Value>list2 = new List<Value>();;
if(jtoken is JArray)
{
int prevFront=-1;
int prevBack=-1;
bool isFrontSet, isBackSet;
foreach (JToken jtokenInArray in (JAray) jtoken)
{
if(jtokenInArray is JObject)
{
value = new Value();
isFrontSet=false;
isBackSet=false;
foreach (KeyValuePair<string, JToken>kvpin(JObject)jtokenInArray)
{
if(kvp.Key=="Front")
{
value.Front=prevFront=(int)kvp.Value;
isFrontSet = true;
}
if(kvp.Key=="Back")
{
value.Back=prevBack=(int)kvp.Value;
isBackSet = true;
}
}
if(isFrontSet==false)
{
value.Front=prevFront;
isFrontSet = true;
}
if(isBackSet==false)
{
value.Back =prevBack;
isBackSet = true;
}
list2.Add(value);
}
}
}
public class value
{
public int front {get;set;}
public int back {get;set;}
}
The results are as follows (Visual Studio debug image):
© 2024 OneMinuteCode. All rights reserved.