简体   繁体   中英

How do I edit JSON values in c# with LitJson in Unity3D?

So I am trying to take a .json file and read it in c#, then modify one of the values, and then refresh the .json file so that the value is changed. I know how to read the file, and how to overwrite the file, but how do I change one specific value of one specific item in the file?

The goal of this script is to create an inventory system, where the balance can be recorded through the json file. I want to use the BalanceChange() function to go to the file, find the correct item using the ID variable, and then change the balance accordingly.

Here is my .json script:

[
    {
    "name":"Potion",
    "id":1,
    "balance":5
    },
    {
    "name":"Neutral Bomb",
    "id":2,
    "balance": 4
    }
]

Here is my c# script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using LitJson;


public class Item
{
    public string Name  { get; set; }
    public int Id       { get; set; }
    public int Balance  { get; set; }

    public Item(string name1, int id1, int balance1) {
        Name = name1;
        Id = id1;
        Balance = balance1;
    }
}

public class InventoryAttempt : MonoBehaviour
{
    public static void BalanceChange(string filePath, int ID, int change)
    {
        string jsonString = File.ReadAllText(Application.dataPath + filePath);
        List<Item> itemList = JsonMapper.ToObject<List<Item>>(jsonString);
        itemList [ID].Balance += change;
        jsonString = JsonMapper.ToJson (itemList).ToString();
        File.WriteAllText (Application.dataPath + filePath, jsonString);
    }

    void Start()
    {
        BalanceChange ("/Scripts/inventory.json", 1, -1);
    }
}

This script isn't working for some reason. I keep getting this error:

MissingMethodException: Method not found: 'Default constructor not found...ctor() of Item'.
System.Activator.CreateInstance (System.Type type, Boolean nonPublic) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Activator.cs:368)
System.Activator.CreateInstance (System.Type type) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Activator.cs:254)
LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader)
LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader)
LitJson.JsonMapper.ToObject[List`1] (System.String json)
InventoryAttempt.BalanceChange (System.String filePath, Int32 ID, Int32 change) (at Assets/Scripts/InventoryAttempt.cs:26)
InventoryAttempt.Start () (at Assets/Scripts/InventoryAttempt.cs:34)

Yes, that's the purpose of these librarys. I'm not familiar with LitJson specifically but most of these are similar:

Based on the doucmentation examples; we take json and turn it to an object, change a property and then save it to json again:

public class Person
{
    // C# 3.0 auto-implemented properties
    public string   Name     { get; set; }
    public int      Age      { get; set; }
    public DateTime Birthday { get; set; }
}


public class Example{
    public static void JsonToPerson()
    {
    string json = @"
        {
            ""Name""     : ""Thomas More"",
            ""Age""      : 57,
            ""Birthday"" : ""02/07/1478 00:00:00""
        }";

    Person thomas = JsonMapper.ToObject<Person>(json);

    thomas.Age = 23;

    string newJson = JsonMapper.ToJson(thomas);
    }
}

To edit a property we simply change the Objects property. In my example I edit thomas.Age to 23 and then serialize the object to json again. Should give us the following json:

{
    ""Name""     : ""Thomas More"",
    ""Age""      : 23,
    ""Birthday"" : ""02/07/1478 00:00:00""
}

If you'd like to have many Person in one json, you add them to a list and serialize the list. If you'd like an unique identifier for every distinct object you could, among other things, add an Id property to Person. Like this:

First add the Id propery to the Person class:

public string Id { get; set; }

and the usage/list serialization:

List<Person> people = List<Person>();

Person thomas = new Person();
thomas.Name = "Thomas";
thomas.Id = "0001";
people.Add(thomas);

Person albert = new Person();
albert.Name = "Albert";
albert.Id = "0002";
people.Add(albert);

JsonMapper.ToJson(people);

This should give you Json like this:

{
    {
        ""Name""     : ""Thomas"",
        ""Id""       : ""0001""
    },
    {
        ""Name""     : ""Albert"",
        ""Id""       : ""0002""
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM