2014-10-19 2 views
0

JSON следующим образом:JSON Запись 1 одномерный массив

"Items": { 
"defaultActionClass": "Weaponclass", 
"ItemObjects": [ 
    { 
    "Id": "M16", 
    "Name": "EM16", 
    "Description": "Some Description", 
    "Icon": "Icons/pictures/1.png", 
    "AnimationSet": "Set1", 
    "Type": "Weapon", 
    "EquipmentClass": "Hands", 
    "SlotsCount": 2, 
    "Weight": 1, 
    "AP": 1, 
    "BurstFire": 1, 
    "AutoFire": 0, 
    "EffectiveRange": 8.0, 
    "MuzzleVelocity": 2.5, 
    "BaseAccuracy": 100.0, 
    "Mobility": 6.0, 
    "Damage": 30, 
    "DamageFalloff": 30, 
    "AmmoClips": [ 
     "AmmoClip556NATOx30" 
    ] 
    }, 

Часть я борюсь с это:

"AmmoClips": [ 
    "AmmoClip556NATOx30" 
] 

Я могу читать и писать остальную часть файла, но это одно, что я могу «т найти решение для этого раздела

Я читал его с помощью:

Public Property AmmoClips As String() 
Ammunition = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].AmmoClips").ToString) 

Это возвращает:

[ 
    "AmmoClip556NATOx30" 
] 

Я затем попытаться использовать следующий, чтобы написать его обратно, и я попытался десятки различных методов не повезло.

Imports System.IO 
Imports System.Windows 
Imports Newtonsoft.Json 
Imports Newtonsoft.Json.Linq 
Imports System.Text 

Public Class Form1 
    Dim GamePath As String 
    Dim Gamefile As String 
    Dim strjson As String 
    Dim obj As Object 
    Dim NextCount As Integer 
    Dim Ammunition 
    Dim AmmoOutput 



    Public Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     GamePath = "E:\SteamLibrary\SteamApps\common\Jagged Alliance Flashback\game_Data\StreamingAssets\Original\Data\" 
     Gamefile = "Items\Weapons.json" 
     strjson = File.ReadAllText(GamePath & Gamefile) 
     'RichTextBox1.Text = strjson 
     Dim root As RootObject = JsonConvert.DeserializeObject(Of RootObject)(strjson) 
     Dim ID As List(Of String) = root.Items.ItemObjects.Select(Of String)(Function(tp) tp.Id).ToList() 
     cmbWeaponID.DataSource = ID 
     NextCount = ID.Count + 1 
    End Sub 



    Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     'Dim sb As New StringBuilder 
     'sb = sb.AppendLine 
     'sb = sb.Append("""AmmoClip44Magnumx6""").AppendLine 
     'sb = sb.AppendLine 
     'Dim sbarray As New JRaw 
     'sbarray = sb 
     AmmoOutput = New String() {Ammunition, Ammunition} 
     ' MsgBox(AmmoOutput) 
     Dim sJsonObj As RootObject = JsonConvert.DeserializeObject(Of RootObject)(File.ReadAllText(GamePath & Gamefile)) 
     sJsonObj.Items.ItemObjects.Add(New ItemObject With { 
     .Id = NextCount, 
     .Name = txtName.Text, 
     .Description = txtDescription.Text, 
     .Icon = "Icons/Weapons/M16.png", 
     .AnimationSet = "Rifle", 
     .Type = "Weapon", 
     .EquipmentClass = "Hands", 
     .SlotsCount = txtSlotCount.Text, 
     .Weight = txtWeight.Text, 
     .AP = txtAPtoFire.Text, 
     .BurstFire = txtBurstFire.Text, 
     .AutoFire = txtAutoFire.Text, 
     .EffectiveRange = txtEffectiveRange.Text, 
     .MuzzleVelocity = txtMuzzleVelocity.Text, 
     .BaseAccuracy = txtBaseAccuracy.Text, 
     .Mobility = txtMobility.Text, 
     .Damage = txtDamage.Text, 
     .DamageFalloff = txtDamageFalloff.Text, 
     .AmmoClips = AmmoOutput 
      }) 

     'Serialize to JSON string. 
     Dim settings As New JsonSerializerSettings 
     settings.NullValueHandling = NullValueHandling.Ignore 
     settings.Formatting = Formatting.Indented 
     Dim strAddJson As String = JsonConvert.SerializeObject(sJsonObj, settings) 

     ' Write to file. 
     File.WriteAllText(GamePath & Gamefile, strAddJson) 

    End Sub 


    Private Sub cmbWeaponID_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbWeaponID.SelectedIndexChanged 
     'cmbWeaponID.Items.Add(weaponjson.SelectToken("Items").SelectTokens("ItemObjects[0].Id")) 
     Dim o As JObject = JObject.Parse(strjson) 
     Dim Type As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Type")) 
     Dim Name As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Name")) 
     Dim Description As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Description")) 
     Dim Icon As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Icon")) 
     Dim AnimationSet As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].AnimationSet")) 
     Dim SlotsCount As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].SlotsCount")) 
     Dim Weight As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Weight")) 
     Dim APCost As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].AP")) 
     Dim BurstFire As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].BurstFire")) 
     Dim AutoFire As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].AutoFire")) 
     Dim EffectiveRange As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].EffectiveRange")) 
     Dim MuzzleVelocity As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].MuzzleVelocity")) 
     Dim BaseAccuracy As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].BaseAccuracy")) 
     Dim Mobility As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Mobility")) 
     Dim Damage As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].Damage")) 
     Dim DamageFalloff As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].DamageFalloff")) 
     If AnimationSet = "Rifle" Or AnimationSet = "Handgun" Then 
      Dim Ammunition As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].AmmoClips[0]")) 
      'MsgBox(Ammunition) 
      txtName.Text = Name 
      txtDescription.Text = Description 
      'picIcon.Image. 
      lblAnimationSet.Text = AnimationSet 
      txtSlotCount.Text = SlotsCount 
      txtWeight.Text = Weight 
      txtAPtoFire.Text = APCost 
      If BurstFire = 1 Then 
       chkBurstFire.Checked = True 
      Else 
       chkBurstFire.Checked = False 
      End If 
      If AutoFire = 1 Then 
       chkAutoFire.Checked = True 
      Else 
       chkAutoFire.Checked = False 
      End If 
      txtBurstFire.Text = BurstFire 
      txtAutoFire.Text = AutoFire 
      txtEffectiveRange.Text = EffectiveRange 
      txtMuzzleVelocity.Text = MuzzleVelocity 
      txtBaseAccuracy.Text = BaseAccuracy 
      txtMobility.Text = Mobility 
      txtDamage.Text = Damage 
      txtDamageFalloff.Text = DamageFalloff 
      txtAmmunition.Text = Ammunition 
     ElseIf AnimationSet = "Unarmed" Or AnimationSet = "Knife" Or AnimationSet = "Machete" Then 
      txtName.Text = Name 
      txtDescription.Text = Description 
      'picIcon.Image. 
      lblAnimationSet.Text = AnimationSet 
      txtSlotCount.Text = SlotsCount 
      txtWeight.Text = Weight 
      txtAPtoFire.Text = APCost 
      If BurstFire = 1 Then 
       chkBurstFire.Checked = True 
      Else 
       chkBurstFire.Checked = False 
      End If 
      If AutoFire = 1 Then 
       chkAutoFire.Checked = True 
      Else 
       chkAutoFire.Checked = False 
      End If 
      txtEffectiveRange.Text = EffectiveRange 
      txtMuzzleVelocity.Text = MuzzleVelocity 
      txtBaseAccuracy.Text = BaseAccuracy 
      txtMobility.Text = Mobility 
      txtDamage.Text = Damage 
      txtDamageFalloff.Text = DamageFalloff 
      txtAmmunition.Text = Nothing 
     ElseIf AnimationSet = "Throw" Then 
      Dim MaxRange As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].MaxRange").ToString) 
      Dim ThrowRange As String = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].ThrowRange").ToString) 
      txtName.Text = Name 
      txtDescription.Text = Description 
      'picIcon.Image. 
      lblAnimationSet.Text = AnimationSet 
      txtSlotCount.Text = SlotsCount 
      txtWeight.Text = Weight 
      txtAPtoFire.Text = APCost 
      If BurstFire = 1 Then 
       chkBurstFire.Checked = True 
      Else 
       chkBurstFire.Checked = False 
      End If 
      If AutoFire = 1 Then 
       chkAutoFire.Checked = True 
      Else 
       chkAutoFire.Checked = False 
      End If 
      txtEffectiveRange.Text = EffectiveRange 
      txtMuzzleVelocity.Text = MuzzleVelocity 
      txtBaseAccuracy.Text = BaseAccuracy 
      txtMobility.Text = Mobility 
      txtDamage.Text = Damage 
      txtDamageFalloff.Text = DamageFalloff 
      txtMaxRange.Text = MaxRange 
      txtThrowRange.Text = ThrowRange 
      txtAmmunition.Text = Nothing 

     End If 

    End Sub 
    End Class 
Public Class ItemObject 
    Public Property Id As String 
    Public Property Name As String 
    Public Property Description As String 
    Public Property Icon As String 
    Public Property AnimationSet As String 
    Public Property Type As String 
    Public Property EquipmentClass As String 
    Public Property SlotsCount As Integer 
    Public Property Weight As Integer 
    Public Property AP As Integer 
    Public Property BurstFire As Integer 
    Public Property AutoFire As Integer 
    Public Property EffectiveRange As Double 
    Public Property MuzzleVelocity As Double 
    Public Property BaseAccuracy As Double 
    Public Property Mobility As Double 
    Public Property Damage As Integer 
    Public Property DamageFalloff As Double 
    Public Property AmmoClips As List(Of String) 
    Public Property Melee As Integer? 
    Public Property ActionClass As String 
    Public Property MaxRange As Integer? 
    Public Property ThrowRange As Integer? 
    Public Property RandomLootPercents As Integer? 
    Public Property ExplosionType As String 
End Class 

Public Class Items 
    Public Property defaultActionClass As String 
    Public Property ItemObjects As List(Of ItemObject) 
End Class 

Public Class RootObject 
    Public Property Items As Items 
End Class 

Что мне здесь не хватает?

ответ

0

ОК, основываясь на вашем последнем коде выглядит, как у вас AmmoClips объявлен как List(Of String) в вашем ItemObject классе. Таким образом, в вашем Button1_Click, вам нужно:

  1. Объявите переменную как List(Of String)
  2. Add() вашей строки боеприпасов к этому списку
  3. Присвоить список в AmmoClips собственности

Кроме того, это похоже, что вы пытаетесь напрямую назначить строки из других текстовых полей свойствам, которые определены как Integer и Double в вашем классе ItemObject. Это также вызывает ошибки. Для преобразования значений в этих случаях вам необходимо использовать CInt и CDbl. Таким образом, обновленный код Button1_Click должен выглядеть следующим образом:

Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim sJsonObj As RootObject = JsonConvert.DeserializeObject(Of RootObject)(File.ReadAllText(GamePath & Gamefile)) 

    Dim AmmoOutput As New List(Of String) 
    AmmoOutput.Add(txtAmmunition.Text) 

    sJsonObj.Items.ItemObjects.Add(New ItemObject With { 
    .Id = NextCount, 
    .Name = txtName.Text, 
    .Description = txtDescription.Text, 
    .Icon = "Icons/Weapons/M16.png", 
    .AnimationSet = "Rifle", 
    .Type = "Weapon", 
    .EquipmentClass = "Hands", 
    .SlotsCount = CInt(txtSlotCount.Text), 
    .Weight = CInt(txtWeight.Text), 
    .AP = CInt(txtAPtoFire.Text), 
    .BurstFire = CInt(txtBurstFire.Text), 
    .AutoFire = CInt(txtAutoFire.Text), 
    .EffectiveRange = CDbl(txtEffectiveRange.Text), 
    .MuzzleVelocity = CDbl(txtMuzzleVelocity.Text), 
    .BaseAccuracy = CDbl(txtBaseAccuracy.Text), 
    .Mobility = CDbl(txtMobility.Text), 
    .Damage = CInt(txtDamage.Text), 
    .DamageFalloff = CDbl(txtDamageFalloff.Text), 
    .AmmoClips = AmmoOutput 
     }) 

    'Serialize to JSON string. 
    Dim settings As New JsonSerializerSettings 
    settings.NullValueHandling = NullValueHandling.Ignore 
    settings.Formatting = Formatting.Indented 
    Dim strAddJson As String = JsonConvert.SerializeObject(sJsonObj, settings) 

    ' Write to file. 
    File.WriteAllText(GamePath & Gamefile, strAddJson) 

End Sub 
+0

Одинаковая проблема там, кнопка, которая обрабатывает добавление, взрывается, как только она попадает .ammoclip = буквально что-нибудь, строка, переменная и т. Д. Нужно ли определять AmmoClips как не свойство, а свой собственный класс под ItemObejects, возможно, ? –

+0

Можете ли вы изменить свой вопрос, чтобы показать полный код, который «взрывается» и какую ошибку вы получаете?Я не вижу ваш код (кроме отрывков, которые вы опубликовали), и трудно диагностировать, что происходит неправильно, если я должен угадать, что вы делаете. –

+0

Добавлен во все и да, это довольно уродливо, так как я пробовал всевозможные вещи. Фактическая ошибка Невозможно передать объект типа «System.String []» для ввода «System.Collections.Generic.List'1 [System.String]». –

0

AmmoClips является массивом, поэтому, вероятно, следует добавить [] это, чтобы принести его содержимое

Public Property AmmoClips As String() 
Ammunition = CStr(o.SelectToken("Items.ItemObjects[" & cmbWeaponID.SelectedIndex & "].AmmoClips[0]").ToString) 
+0

Забор работает независимо от его записи, которая меня убивает. Он продолжает возвращать: Невозможно наложить объект типа 'System.String' на тип 'System.String [] –

+0

Вы получаете эту ошибку, потому что ваша переменная 'Ammunition' является строкой, которая содержит значение' [" AmmoClip556NATOx30 "]'. Вы не можете назначить это обратно в «AmmoClips» (который является массивом String) - вы должны получить весь массив в массив String, внести любые изменения, которые хотите, а затем назначить этот массив обратно в свойство AmmoClips при написании его обратно. – pmcoltrane

+0

Это часть, с которой я борюсь, как получить этот конкретный элемент в массив строк. Честно говоря, в этот момент я даже не пытаюсь его редактировать, я просто пытаюсь его прочитать и написать. –

Смежные вопросы