Я получаю файл json из сценария php, и он выглядит так:
[
{"data": { "yaw":0.0, "roll":0.0, "pitch":0.0 }, "name":"acceleration", "unit":"deg" },
{"data": { "yaw":0.0, "roll":0.0, "pitch":0.0 }, "name": "gyro", "unit":"deg"}
]
Итак, я делаю ListView, который будет показывать значения имени, рыскания, крена и тангажа и Блок. Я уже сделал ListView, и мой xaml выглядит так:
<ListView Grid.Row="0" ItemsSource="{Binding OriMeasurements}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="100" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Roll" Width="100" DisplayMemberBinding="{Binding Roll}"/>
<GridViewColumn Header="Pitch" Width="100" DisplayMemberBinding="{Binding Pitch}"/>
<GridViewColumn Header="Yaw" Width="100" DisplayMemberBinding="{Binding Yaw}"/>
<!--<GridViewColumn Header="Data" Width="100" DisplayMemberBinding="{Binding Data}"/>-->
<GridViewColumn Header="Unit" Width="100" DisplayMemberBinding="{Binding Unit}"/>
</GridView>
</ListView.View>
</ListView>
Затем MeasurementModel.cs
public class MeasurementModel
{
public string Name { get; set; }
public double Data { get; set; }
public string Unit { get; set; }
public double Roll { get; set; }
public double Pitch { get; set; }
public double Yaw { get; set; }
}
tableServer.cs
public class tableServer
{
public dynamic getMeasurementsOri()
{
var json = new WebClient().DownloadString("http://ip/file.php");
return JArray.Parse(json);
}
}
TableViewModel.cs
public class TableViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
private double _roll;
public string Roll
{
get
{
return _roll.ToString("0.0####", CultureInfo.InvariantCulture);
}
set
{
if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _roll != tmp)
{
_roll = tmp;
OnPropertyChanged("Data");
}
}
}
private double _pitch;
public string Pitch
{
get
{
return _pitch.ToString("0.0####", CultureInfo.InvariantCulture);
}
set
{
if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _pitch != tmp)
{
_pitch = tmp;
OnPropertyChanged("Data");
}
}
}
private double _yaw;
public string Yaw
{
get
{
return _yaw.ToString("0.0####", CultureInfo.InvariantCulture);
}
set
{
if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _yaw != tmp)
{
_yaw = tmp;
OnPropertyChanged("Data");
}
}
}
private double _data;
public string Data
{
get
{
return _data.ToString("0.0####", CultureInfo.InvariantCulture);
}
set
{
if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out double tmp) && _data != tmp)
{
_data = tmp;
OnPropertyChanged("Data");
}
}
}
private string _unit;
public string Unit
{
get
{
return _unit;
}
set
{
if (_unit != value)
{
_unit = value;
OnPropertyChanged("Unit");
}
}
}
public TableViewModel(MeasurementModel model)
{
UpdateWithModel(model);
}
public void UpdateWithModel(MeasurementModel model)
{
_name = model.Name;
OnPropertyChanged("Name");
_data = model.Data;
OnPropertyChanged("Data");
_unit = model.Unit;
OnPropertyChanged("Unit");
_roll = model.Roll;
OnPropertyChanged("Roll");
_pitch = model.Pitch;
OnPropertyChanged("Pitch");
_yaw = model.Yaw;
OnPropertyChanged("Yaw");
}
#region PropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
/**
* @brief Simple function to trigger event handler
* @params propertyName Name of ViewModel property as string
*/
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
Все до этого момента работает правильно. ListView генерируется с правильными столбцами. Теперь эта часть сбивает меня с толку:
MainViewModel.cs
void RefreshHandlerOri()
{
// Read data from server in JSON array format
dynamic measurementsJsonArray = iotTableOri.getMeasurementsOri();
// Convert generic JSON array container to list of specific type
dynamic measurementsListA = measurementsJsonArray.ToObject<List<MeasurementModel>>();
// Add new elements to collection
if (OriMeasurements.Count < measurementsListA[0].Count)
{
foreach (var m in measurementsListA[0])
OriMeasurements.Add(new TableViewModel(m));
}
// Update existing elements in collection
else
{
for (int i = 0; i < OriMeasurements.Count; i++)
{
OriMeasurements[i].UpdateWithModel(measurementsListA[0]);
}
}
}
Как я могу извлечь эти значения из показанного json в свой список. Я пробовал много вариантов, но чаще всего получаю сообщение об ошибке Ошибка при чтении двойной, Неожиданный токен: StartObject.Path '[0] .data', строка 1, позиция 11. ' Любая помощь приветствуется.