Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Узел как value type, Р° РЅРµ указатель

Здравствуйте
С++ не очень хорошо знаю, немного учил javascript и java , надеюсь смогу
сформулировать вопрос

Есть узел с дочерними узлами .
C++
1
2
3
4
5
6
7
8
9
10
class Node
{
 
    std::vector<Node*> children;
    std::string name;
 
public:
 
std::vector<Node*> get_children();
};
Хотелось бы что бы узел был доступен пользователю
как Value type, а не как указатель .



Пока есть так
C++
1
2
3
4
5
Node node* =  find_node (.... );
 
// тут проверка что РЅРµ null  
if (! node) 
   ........
Но хотелось бы чтобы у пользователя не была доступа к указателю , но доступ к узлу был
То есть так
C++
1
2
3
4
5
Node node =  find_node (.... );
 
// тут проверка что не пустой 
if ( node.empty()) 
   ........
Как в с++ можно добиться такого поведения для узла ?

В векторе необходимо ведь узлы как указатели хранить ?
Ответ:
Сообщение от cpp_user
как Value type, а не как указатель .
Сообщение от DrOffset
Можно, чтобы find_node возвращал std::optional<Node>.
Как-то это не эффективно и не логично
Указатель тут как раз к месту.

Сообщение от cpp_user
, а юзеру указатели должны быть недоступны
Почему нет?

Сообщение от cpp_user
немного учил javascript и java
Наверное лучше бы не учили )))

Добавлено через 3 минуты
C++
1
2
3
4
5
Node* node = find_node (....);
if (node) 
{
 
}
Куда более естественно для С++
Вопрос: Ошибка Could not convert variant of type (Null) into type (String)

Как только начинаю вводить инфу в edit появляется ошибка Could not convert variant of type (Null) into type (String)
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm2.Table1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
    a,f:string;
begin
  case ComboBox1.ItemIndex of
  0:  f:='Name';
  1:  f:='Year';
  2:  f:='Country';
  3:  f:='Mass';
  4:  f:='Len';
  5:  f:='Capacity';
  end;
  begin
a := Copy(DataSet[f],1, Length(Edit1.Text));
Accept := a = Edit1.text;
end;
end;
ошибка в a := Copy(DataSet[f],1, Length(Edit1.Text))
Ответ:
Сообщение от xq
Как только начинаю вводить инфу в edit появляется ошибка Could not convert variant of type (Null) into type (String)
Это значит, что в наборе данных DataSet в какой-то записи, в поле F, встретилось значение NULL. И ошибка произошла при попытке работать с NULL, как со строкой. Чтобы исправить эту проблему, надо предусмотреть действия на случай обнаружения NULL:
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm2.Table1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
    a,f:string;
begin
  case ComboBox1.ItemIndex of
  0:  f:='Name';
  1:  f:='Year';
  2:  f:='Country';
  3:  f:='Mass';
  4:  f:='Len';
  5:  f:='Capacity';
  end;
  if VarIsNull(DataSet[f]) then
  begin
    ...
  end
  else
  begin
    a := Copy(DataSet[f],1, Length(Edit1.Text));
    Accept := a = Edit1.text;
  end;
end;
Вопрос: Пользовательский value type и проблема с роутингом

В нашем проекте WebApi мы используем EF CodeFirst подход. Также мы используем 2 вида баз данных: SQL Server и MySQL. Все таблицы имеют поле ID, но в базе данных SQL Server это поле имеет тип данных INT, а в базе данных MySQL - char(36) и содержит GUID.

Чтобы решить проблему, я создал пользовательский тип значения IdType и изменил все классы модели, чтобы использовали этот тип вместо INT:
public class Document
{
  public IdType ID { get; set; }
  public string DocumentNm { get; set; }
  ...
}

Затем я настроил DbContext (например, для SQL Server)
modelBuilder.Properties<IdType>().Configure(c => c.HasColumnType("int"));

... и репозиторий:
public interface IRepository<T> where T : IEntity
{
  IQueryable<T> GetAll();
  T GetById(IdType id);
  ...
}

После этого, когда я пытаюсь идти до, например он дает мне ошибку:
Multiple actions were found that match the request: \r\nGet on type WebUI.Controllers.API.DocumentController\r\nGetById on type WebUI.Controllers.API.DocumentController

Я использую по умолчанию настройки маршрутизации. Вот [HttpGet] методы из DocumentController:
public HttpResponseMessage Get() { ... }
public HttpResponseMessage GetById(IdType id) { ... }

Как я могу решить эту проблему? Может ли это быть причиной неправильной реализации IdType?

Я создал IdType для Int значений, как описано .
Ответ: свои value типы эт ...у меня дурной опыт был )
зачем так сложно?
принимай всегда строку. в коде проверяй если это число то запрос туда то если гуид то сюда. профит.

п.с. скорее всего дефолтный биндер мвц не может понять твой тип данных.
Вопрос: Ошибка Warning: Cannot use a scalar value as an array in

Доброго времени суток!

Помогите разобраться как правильно написать код, чтобы сработал?

Есть основной скрипт который выполняет различные условия и в зависимости от условий в массив

Код
$error[]
попадает различный текст ошибок. Но выдает ошибку

Код
Warning: Cannot use a scalar value as an array in D:\SERVERS\OSPanel\...
на строку

Код
	$error[] = "Нет изображений";
	$error[] = 'Нет изображений';
Как тогда правильно добавлять в массив данные?

PHP
1
2
3
4
5
6
7
8
9
10
$error[] = "Нет изображений";
    $error[] = 'Нет изображений';
    if (isset($error) && is_array($error) && (count($error)> 0)) {
        $num = count($error);
        for($i=0;$i<$num;$i++){
        echo "$error[$i] <br>";
            }
    }else{
        echo MessScriptShow('Изображения загружены!');
    }
Ответ: нет массива $error[$i]
Сообщение от wolfz
echo "$error[$i] <br>";
Вопрос: Ошибка: Could not convert variant of type (null) into type (olestr)

здравствуйте
подскажите пожалуйста
использую для ввода в базу sql cxgrid (по идеи у меня cxgrid много на форме только проблема возникла с двумя)
при добавление новой записи с навигатора (+) я нажимаю мышкой на поле для ввода и у меня сразу выдаёт ошибку
Could not convert variant of type (null) into type (olestr), конечно ошибку можно закрыть и вводить свои значения всё будет нормально .
раньше такого не было (другие cxgrid нормально работают)
подскажите где что поправить
заранее благодарен

Добавлено через 3 минуты
заметил на других гридах появляется курсор внутри нового поля
а в этих дргух просто выделяется вся новая строка

Добавлено через 5 часов 18 минут
интересное кино у меня вот такая штука для определения где сейчас находится курсор передаётся в label/
Delphi
1
label1.Caption:=cxGrid1DBTableView1.DataController.GetValue(cxGrid1DBTableView1.DataController.FocusedRecordIndex,1)
если отключить просто одну эту строчку то всё нормально .
то есть при добавление новой строки в грид и клик по пустоте он начинает ругаться .
может как то её преобразовать эту строчку чтобы не реагировала на пустое значение.
Ответ: тема закрыта
Вопрос: Ошибка Could not convert variant of type (Null) into type (String)

У меня вопрос по моему проекту...!)
Если кто знает помогите, в свойствах компонента DBGrid --> OnDrowColumnCell --> пишу код

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
Image1.Picture.LoadFromFile(ADOTable1['фотография']);
Image1.Stretch:=true;
end;
 
end.
У меня две формы, выдат ошибку когда я пытаюсь на первой форме нажать Button
ошибка в неправильности ТИПОВ данных, я не знаю где ставится перевод может кто-нибудь подсказать, ну если я правильно понял конечно о типе...
ВОТ ошибка
'Could not convert variant of type (Null) into type (String)'. Process stoped. Use step of Run of to continue.
Ответ:
Сообщение от smus
Объясните, как убрать эти сообщения об ошибках
какие эти? Кто их видит, кроме Вас?
И зачем влезли в чужую тему шестилетней давности, вместо того, чтобы создать свою?
И на кой вообще ляд работать с базой напрямую? Есть такая штука, как запросы, тем более при работе с MS SQL Server...
Вопрос: Ошибка "Could convert variant of type (Null) into type (oleStr)"

Пишу программу для курсовой работы, программка на тему АРМ Администратора анти-кафе, выскакивает ошибка Could convert variant of type (Null) into type (oleStr) и программа работает не корректно,
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
procedure TmainForm.singleExitButtonClick(Sender: TObject);
var rowId, count, status: integer;
    inTime: TDateTime;
begin
  rowId := DataSource1.DataSet.FieldByName('id').Value;
  count := DataSource1.DataSet.FieldByName('visitorCount').Value;
  status := DataSource1.DataSet.FieldByName('status').Value;
  inTime := DataSource1.DataSet.FieldByName('inTime').Value;
 
  rowCursor := ADOQuery1.RecNo;
  ADOQuery1.Close;
  ADOQuery1.Active:=false;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('update visitors set visitorCount=' + (count - 1).ToString());
  ADOQuery1.SQL.Add('where id=' + rowId.ToString());
  ADOQuery1.ExecSQL;
 
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('insert into visitors(visitorName, inTime, visitorCount, isActive, status) values("Гость' + rowId.ToString() + '", :date, 1, TRUE, ' + status.ToString() + ')');
  ADOQuery1.Parameters.ParamByName('date').Value := inTime;
  ADOQuery1.ExecSQL;
 
  updateGrid();
end;
 
procedure TmainForm.updateGrid();
begin
  ADOQuery1.Close;
  ADOQuery1.Active:=false;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('select id, visitorName, visitorCount, inTime, outTime, price, isActive, status from visitors');
  ADOQuery1.SQL.Add('where isActive or DATEPART("y", inTime)=DATEPART("y", :date)');
  ADOQuery1.Parameters.ParamByName('date').Value := DateTimePicker.DateTime;
  ADOQuery1.Open;
  ADOQuery1.Active:=true;
  if ADOQuery1.RecordCount > 0 then
    ADOQuery1.RecNo := rowCursor;
 
  ADOQuery2.Close;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('select sum(t.price) as totalPrice from (select sum(price) as price from visitors union select sum(cash) as price from cashbox) t');
  ADOQuery2.Open;
  cashValue.Caption := DataSource2.DataSet.FieldByName('totalPrice').Value;
end;
 
procedure TmainForm.updateButtonClick(Sender: TObject);
begin
  updateGrid();
end;
 
procedure TmainForm.cashboxButtonClick(Sender: TObject);
begin
  ADOQuery2.Close;
  if incomeEdit.Text <> '' then
  begin
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Add('insert into cashbox(cash) values(' + incomeEdit.Text + ')');
    ADOQuery2.ExecSQL;
  end;
 
  if outcomeEdit.Text <> '' then
  begin
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Add('insert into cashbox(cash) values(-' + outcomeEdit.Text + ')');
    ADOQuery2.ExecSQL;
  end;
  incomeEdit.Text := '';
  outcomeEdit.Text := '';
 
  updateGrid();
end;
 
procedure TmainForm.DateTimePickerChange(Sender: TObject);
begin
  updateGrid();
end;
 
procedure TmainForm.DBGrid1CellClick(Column: TColumn);
begin
  rowCursor := ADOQuery1.RecNo;
end;
 
procedure TmainForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (DBGrid1.DataSource.DataSet.FieldValues['status'] = 1) or (DBGrid1.DataSource.DataSet.FieldValues['status'] = 2) then
    DBGrid1.Canvas.Brush.Color := RGB(144, 195, 212)
  else  if (not DBGrid1.DataSource.DataSet.FieldValues['isActive'] = true) then
  begin
    DBGrid1.Canvas.Brush.Color := RGB(242, 129, 111)
  end;
 
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
 
procedure TmainForm.deleteButtonClick(Sender: TObject);
var rowId: integer;
begin
  rowId := DataSource1.DataSet.FieldByName('id').Value;
 
  rowCursor := ADOQuery1.RecNo;
  ADOQuery1.Close;
  ADOQuery1.Active:=false;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('delete from visitors');
  ADOQuery1.SQL.Add('where id=' + rowId.ToString());
  ADOQuery1.ExecSQL;
 
  updateGrid();
end;
 
procedure TmainForm.exitButtonClick(Sender: TObject);
var rowId, count, status: integer;
    inTime, timeBetween: TDateTime;
    price, discount: Extended;
begin
  rowId := DataSource1.DataSet.FieldByName('id').Value;
  inTime := DataSource1.DataSet.FieldByName('inTime').Value;
  count := DataSource1.DataSet.FieldByName('visitorCount').Value;
  status := DataSource1.DataSet.FieldByName('status').Value;
 
  case status of
   0: discount := 1;
   1: discount := 1;
   2: discount := 1;
   3: discount := 0.5;
   4: discount := 0.7;
   5: discount := 0.7;
   6: discount := 0.5;
  end;
 
  timeBetween :=  MinutesBetween(Now, inTime);
  if status = 1 then
    price := 250 * count
  else if status = 2 then
    price := 500 * count
  else if timeBetween < 60 then
    price := 120 * count * discount
  else if timeBetween > 250 then
    price := 500 * count * discount
  else
  price :=  2 * timeBetween * count * discount;
 
  rowCursor := ADOQuery1.RecNo;
  ADOQuery1.Close;
  ADOQuery1.Active:=false;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('update visitors set outTime=:date, isActive=FALSE, price=' + price.ToString());
  ADOQuery1.SQL.Add('where id=' + rowId.ToString());
  ADOQuery1.Parameters.ParamByName('date').Value := Now;
  ADOQuery1.ExecSQL;
 
  updateGrid();
end;
 
procedure TmainForm.FormShow(Sender: TObject);
begin
  rowCursor := 1;
  DateTimePicker.DateTime := Now;
  updateGrid();
end;
 
procedure TmainForm.insertButtonClick(Sender: TObject);
begin
  rowCursor := ADOQuery1.RecNo;
  ADOQuery1.Close;
  ADOQuery1.Active:=false;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('insert into visitors(visitorName, inTime, visitorCount, isActive, status) values("' + nameEdit.Text + '", :date, ' + countSpinEdit.Text + ', TRUE, ' + statusComboBox.ItemIndex.ToString() + ')');
  ADOQuery1.Parameters.ParamByName('date').Value := Now;
  ADOQuery1.ExecSQL;
  nameedit.Clear;
 
  updateGrid();
end;
 
end.
Ответ: Спасибо большое)
Вопрос: Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object

Всем привет! Помогите, плиз, разобраться с ошибкой:

An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Test.Form_Main+RootObject' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.


C#
1
2
3
4
5
6
7
8
9
10
 public class RootObject
        {
            public string test { get; set; }
            public string test2 { get; set; }
            public string test3 { get; set; }
        }
 
string json = "[{ "test":"12213","test2":"24242","test3":"34535"]";
            RootObject newM = JsonConvert.DeserializeObject<RootObject>(json);
            rTB_Status.Text = newM.test;
Добавлено через 27 минут
Полный текст ошибки

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Test.Form_Main+RootObject' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path '', line 1, position 1.


Добавлено через 38 минут
Нашла решение - нужно убрать квадратные скобки ][

Кто-нибудь подскажет, с помощью какой команды убрать из строки квадратные скобки?
Строка будет приходить с квадратными скобками, вручную не получится редактировать.
Ответ: Подскажите, пожалуйста, как добраться до данных counts и date класса Number?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public class RootObject
        {
            public string test { get; set; }
            public string test2 { get; set; }
            public string test3 { get; set; }
            public Rang Rang { get; set; }
        }
 
public class Rang
        {
            public List<Number> numbers { get; set; }
        }
 
 public class Number
        {
            public Count counts { get; set; }
            public string date { get; set; }
        }

C#
1
2
RootObject newM = JsonConvert.DeserializeObject<RootObject>(json);
rTB_Result.Text = newM.test;
Вопрос: При конвертации даты возникает ошибка could not convert variant of type(Null) into type (date)

Добрый день.Помогите пожалуйста. При конвертации даты возникает ошибка could not convert variant of type(Null) into type (date) .
Код C++
1
2
3
4
5
if(Sender->Value!=varNull)
  {
   TDateTime d = Sender->Value;
   Text = DateToStr(d);
  }
Заранее спасибо.
Ответ: Спасибо)) Работает!
Вопрос: JSON сериализация в Key-Value

Здравствуйте.
Есть слудующий json:
Json

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{
    "rates_scores_stats": [{
            "name": 10,
            "value": 3545
        }, {
            "name": 9,
            "value": 1004
        }, {
            "name": 8,
            "value": 820
        }, {
            "name": 7,
            "value": 493
        }, {
            "name": 6,
            "value": 218
        }, {
            "name": 5,
            "value": 138
        }, {
            "name": 4,
            "value": 80
        }, {
            "name": 3,
            "value": 41
        }, {
            "name": 2,
            "value": 26
        }, {
            "name": 1,
            "value": 83
        }
    ],
    "rates_statuses_stats": [{
            "name": "Запланировано",
            "value": 2506
        }, {
            "name": "Смотрю",
            "value": 7861
        }, {
            "name": "Просмотрено",
            "value": 1947
        }, {
            "name": "Отложено",
            "value": 1443
        }, {
            "name": "Брошено",
            "value": 1358
        }
    ]
}

Я знаю, что его можно сериализовать классом следующего типа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class RatesScoresStat
    {
        public int name { get; set; }
        public int value { get; set; }
    }
 
    public class RatesStatusesStat
    {
        public string name { get; set; }
        public int value { get; set; }
    }
 
    public class RootObject
    {
        public List<RatesScoresStat> rates_scores_stats { get; set; }
        public List<RatesStatusesStat> rates_statuses_stats { get; set; }
    }
Но там ведь по сути возвращается ключ-значение. Не хотелось бы городить лишние вспомогательны классы из-за этого.
Не подскажите, как лучше подобное сериализовать, чтобы получилось что-то вроде следующего?
C#
1
2
3
4
5
    public class RootObject
    {
        public Dictionary<int, int> rates_scores_stats { get; set; }
        public Dictionary<string, int> rates_statuses_stats { get; set; }
    }
Конкретно этот пример выдаёт ошибку десериализации =/
Код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;
using System.Net;
 
namespace ShikiTestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = "{'rates_scores_stats':[{'name':10,'value':3545},{'name':9,'value':1004},{'name':8,'value':820},{'name':7,'value':493},{'name':6,'value':218},{'name':5,'value':138},{'name':4,'value':80},{'name':3,'value':41},{'name':2,'value':26},{'name':1,'value':83}],'rates_statuses_stats':[{'name':'Запланировано','value':2506},{'name':'Смотрю','value':7861},{'name':'Просмотрено','value':1947},{'name':'Отложено','value':1443},{'name':'Брошено','value':1358}]}";
 
            var result = JsonConvert.DeserializeObject<TestClass>(json);
 
            Console.WriteLine(result.rates_scores_stats[9]);
        }
    }
 
    public class TestClass
    {
        public Dictionary<int, int> rates_scores_stats { get; set; }
        public Dictionary<string, int> rates_statuses_stats { get; set; }
    }
}

Ошибка

Newtonsoft.Json.JsonSerializationException не обработано
HResult=-2146233088
Message=Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'rates_scores_stats', line 1, position 23.
Source=Newtonsoft.Json
StackTrace:
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
в Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
в Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
в Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
в Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
в ShikiTestApp.Program.Main(String[] args) в D:\Clouds\OneDrive\Documents\Visual Studio 2015\Projects\!Experemental\ShikiTestApp\ShikiTestApp\Program.cs:строка 18
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:


Добавлено через 1 час 0 минут
Обнаружил, что если использовать List<KeyValuePair<TKey, TValue>>, то value подхватывается, а key нет, ибо в json этот параметр называется name.
Если изменить в json название параметра name на key, но всё работает идеально. Однако я не могу изменять формат выдачи ответа с сервера.
Есть ли возможность как-то заставить ассоциировать name с ключём?

Добавлено через 15 минут
Сообщение от babaevkamil
Если изменить в json название параметра name на key, но всё работает идеально.
Воистину, всё гениальное просто..
После получения json строки с сервера просто сделал замену Replace("name", "key") и его уже десериализовывал =D

Добавлено через 19 минут
Хотя.. использование List портит очень многое.. теперь нельзя обратиться к значению по ключу.
Может всё же есть способ десериализовать это в словарь?
Ответ: В итоге я рещил, что обращение по ключу для меня важнее экономии классов и остановился на этом варианте..
Решение со StackOverflow

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class JsonGenericDictionaryOrArrayConverterNameValueMod : JsonConverter
    {
        // поскольку у нас в JSON'е не key/value, а name/value, нужен специальный класс
        // для десериализации одного элемента массива
        class NameValuePair<N, V>
        {
            public N name { get; set; }
            public V value { get; set; }
        }
 
        public override bool CanConvert(Type objectType)
        {
            return GetDictionaryKeyValueTypes(objectType).Count() == 1;
        }
 
        public override bool CanWrite { get { return false; } }
 
        object ReadJsonGeneric<TKey, TValue>(
            JsonReader reader, Type objectType, object existingValue,
            JsonSerializer serializer)
        {
            var tokenType = reader.TokenType;
 
            var dict = existingValue as IDictionary<TKey, TValue>;
            if (dict == null)
            {
                var contract = serializer.ContractResolver.ResolveContract(objectType);
                dict = (IDictionary<TKey, TValue>)contract.DefaultCreator();
            }
 
            if (tokenType == JsonToken.StartArray)
            {
                var pairs = new JsonSerializer()
                                    .Deserialize<NameValuePair<TKey, TValue>[]>(reader);
                if (pairs == null)
                    return existingValue;
                foreach (var pair in pairs)
                    dict.Add(pair.name, pair.value);
            }
            else if (tokenType == JsonToken.StartObject)
            {
                // Using "Populate()" avoids infinite recursion.
                // [url]https://github.com/JamesNK/Newtonsoft.Json/blob/[/url]
                // ee170dc5510bb3ffd35fc1b0d986f34e33c51ab9/Src/Newtonsoft.Json/Converters/
                // CustomCreationConverter.cs
                serializer.Populate(reader, dict);
            }
            return dict;
        }
 
        public override object ReadJson(
                JsonReader reader, Type objectType, object existingValue,
                JsonSerializer serializer)
        {
            // Throws an exception if not exactly one.
            var keyValueTypes = GetDictionaryKeyValueTypes(objectType).Single();
 
            var method = GetType().GetMethod(
                    "ReadJsonGeneric",
                    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            var genericMethod = method.MakeGenericMethod(
                    new[] { keyValueTypes.Key, keyValueTypes.Value });
            return genericMethod.Invoke(
                    this,
                    new object[] { reader, objectType, existingValue, serializer });
        }
 
        public override void WriteJson(
                JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotSupportedException();
        }
 
        static IEnumerable<KeyValuePair<Type, Type>> GetDictionaryKeyValueTypes(Type type)
        {
            foreach (Type intType in GetInterfacesAndSelf(type))
            {
                if (intType.IsGenericType
                    && intType.GetGenericTypeDefinition() == typeof(IDictionary<,>))
                {
                    var args = intType.GetGenericArguments();
                    if (args.Length == 2)
                        yield return new KeyValuePair<Type, Type>(args[0], args[1]);
                }
            }
        }
 
        static IEnumerable<Type> GetInterfacesAndSelf(Type type)
        {
            if (type == null)
                throw new ArgumentNullException();
            if (type.IsInterface)
                return new[] { type }.Concat(type.GetInterfaces());
            else
                return type.GetInterfaces();
        }
    }

Пример использования

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Program
    {
        static void Main(string[] args)
        {
            string json = "{'rates_scores_stats':[{'name':10,'value':3551},{'name':9,'value':1002},{'name':8,'value':823},{'name':7,'value':493},{'name':6,'value':218},{'name':5,'value':139},{'name':4,'value':80},{'name':3,'value':41},{'name':2,'value':26},{'name':1,'value':83}],'rates_statuses_stats':[{'name':'Запланировано','value':2505},{'name':'Смотрю','value':7870},{'name':'Просмотрено','value':1949},{'name':'Отложено','value':1444},{'name':'Брошено','value':1358}]}";
            var result = JsonConvert.DeserializeObject<MyClass>(json, new JsonSerializerSettings { Converters = new JsonConverter[] { new JsonGenericDictionaryOrArrayConverterNameValueMod() } });
 
            Console.WriteLine(result.rates_scores_stats[10] + " | " + result.rates_statuses_stats["Брошено"]);
 
            Console.ReadLine();
        }
    }
    public class MyClass
    {
        public IDictionary<int, int> rates_scores_stats { get; set; }
        public IDictionary<string, int> rates_statuses_stats { get; set; }
    }