.NET - данные JSON - десериализация - списки и словари

Я должен задержать от базы данных JSON документы, которые не основаны на стандартном объекте.

Есть ли способ использовать.NET для "десериализовывания" этих документов в Списки и Словари элементарных объектов (строка, интервал, bool, и т.д....)

Какая-либо библиотека, которая может сделать это в обоих направлениях?

5
задан BuddyJoe 17 July 2009 в 20:16
поделиться

2 ответа

В .NET 3.5 Framework вы можете использовать System.Web.Script.Serialization.JavaScriptSerializer. Использование метода Deserialize вернет объект, который вы можете привести к типу Dictionary или Object[] в зависимости от того, что находится в строке JSON.

3
ответ дан 14 December 2019 в 19:21
поделиться

Я написал подпрограмму прицеливания для xtank некоторое время назад. Я постараюсь выложить, как я это сделал.

Отказ от ответственности: Я, возможно, допустил одну или несколько глупых ошибок в любом месте здесь; Я просто пытаюсь восстановить рассуждения своими ржавыми математическими навыками. Однако сначала я нарежу на погоню, так как это программирование вопросов и ответов вместо класса математики: -)

Как это сделать

Это сводится к решению квадратичного уравнения вида:

a * sqr(x) + b * x + c == 0

Обратите внимание, что под sqr я имею в виду квадрат, в отличие от квадратного корня. Используйте следующие значения:

a := sqr(target.velocityX) + sqr(target.velocityY) - sqr(projectile_speed)
b := 2 * (target.velocityX * (target.startX - cannon.X)
          + target.velocityY * (target.startY - cannon.Y))
c := sqr(target.startX - cannon.X) + sqr(target.startY - cannon.Y)

Теперь мы можем посмотреть на дискриминант, чтобы определить, есть ли у нас возможное решение.

disc := sqr(b) - 4 * a * c

Если дискриминант меньше 0, забудьте о поражении цели - ваш снаряд никогда не сможет попасть туда вовремя. В противном случае рассмотрим два возможных решения:

t1 := (-b + sqrt(disc)) / (2 * a)
t2 := (-b - sqrt(disc)) / (2 * a)

Обратите внимание, что если диск = 0 , то t1 и t2 равны.

Если нет других соображений, таких как вмешательство препятствий, просто выберите меньшее положительное значение. (Отрицательные значения t потребуют выстрела назад во время использования!)

Подставьте выбранное значение t обратно в уравнения положения цели, чтобы получить координаты ведущей точки, на которую вы должны наводиться:

aim.X := t * target.velocityX + target.startX
aim.Y := t * target.velocityY + target.startY

Деривация

В момент T снаряд должен быть (евклидовым) расстоянием от пушки, равным прошедшему Это дает уравнение для окружности, параметрическое за прошедшее время.

sqr(projectile.X - cannon.X) + sqr(projectile.Y - cannon.Y)
  == sqr(t * projectile_speed)

Аналогично, в момент времени Т цель двигалась вдоль своего вектора на время, умноженное на ее скорость:

target.X == t * target.velocityX + target.startX
target.Y == t * target.velocityY + target.startY

Снаряд может поразить цель, когда его расстояние от пушки совпадает с расстоянием снаряда.

sqr(projectile.X - cannon.X) + sqr(projectile.Y - cannon.Y)
  == sqr(target.X - cannon.X) + sqr(target.Y - cannon.Y)

Замечательно! Замена выражений на целевые. Х и цель. Y дает

sqr(projectile.X - cannon.X) + sqr(projectile.Y - cannon.Y)
  == sqr((t * target.velocityX + target.startX) - cannon.X)
   + sqr((t * target.velocityY + target.startY) - cannon.Y)

Подстановка другой стороны уравнения дает следующее:

sqr(t * projectile_speed)
  == sqr((t * target.velocityX + target.startX) - cannon.X)
   + sqr((t * target.velocityY + target.startY) - cannon.Y)

... вычитание sqr (t * projectile_speed) с обеих сторон и его разворот:

sqr((t * target.velocityX) + (target.startX - cannon.X))
  + sqr((t * target.velocityY) + (target.startY - cannon.Y))
  - sqr(t * projectile_speed)
  == 0

... теперь разрешите результаты возведения в квадрат вложенных выражений...

sqr(target.velocityX) * sqr(t)
    + 2 * t * target.velocityX * (target.startX - cannon.X)
    + sqr(target.startX - cannon.X)
+ sqr(target.velocityY) * sqr(t)
    + 2 * t * target.velocityY * (target.startY - cannon.Y)
    + sqr(target.startY - cannon.Y)
- sqr(projectile_speed) * sqr(t)
  == 0

... и группировать подобные термины...

sqr(target.velocityX) * sqr(t)
    + sqr(target.velocityY) * sqr(t)
    - sqr(projectile_speed) * sqr(t)
+ 2 * t * target.velocityX * (target.startX - cannon.X)
    + 2 * t * target.velocityY * (target.startY - cannon.Y)
+ sqr(target.startX - cannon.X)
    + sqr(target.startY - cannon.Y)
  == 0

... затем объединить их...

(sqr(target.velocityX) + sqr(target.velocityY) - sqr(projectile_speed)) * sqr(t)
  + 2 * (target.velocityX * (target.startX - cannon.X)
       + target.velocityY * (target.startY - cannon.Y)) * t
  + sqr(target.startX - cannon.X) + sqr(target.startY - cannon.Y)
  == 0

... получение стандартного квадратичного уравнения в t . Нахождение положительных вещественных нулей этого уравнения даёт (ноль, один или два) возможных места попадания, что можно сделать с помощью квадратичной формулы:

a * sqr(x) + b * x + c == 0
x == (-b ± sqrt(sqr(b) - 4 * a * c)) / (2 * a)
-121--2568939-

Its under/app/config/fluctions.php.

-121--5086082-

Библиотека Json.NET может сериализоваться в и из словаря < последовательность, последовательность > , хотя я не знаю, может ли она десериализовать списки словарей. Я пытался понять это, когда столкнулся с этим вопросом:)

2
ответ дан 14 December 2019 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: