简体   繁体   English

如何在Unity3D中使用LitJson编辑c#中的JSON值?

[英]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. 所以我试图获取.json文件并在c#中读取它,然后修改其中一个值,然后刷新.json文件以便更改该值。 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. 此脚本的目标是创建库存系统,其中可以通过json文件记录余额。 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. 我想使用BalanceChange()函数转到文件,使用ID变量找到正确的项目,然后相应地更改余额。

Here is my .json script: 这是我的.json脚本:

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

Here is my c# script: 这是我的c#脚本:

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: 我不熟悉LitJson,但其中大部分都是相似的:

Based on the doucmentation examples; 基于doucmentation示例; we take json and turn it to an object, change a property and then save it to json again: 我们将json转换为对象,更改属性然后再将其保存到json:

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. 要编辑属性,我们只需更改Objects属性。 In my example I edit thomas.Age to 23 and then serialize the object to json again. 在我的例子中,我将thomas.Age编辑为23,然后再次将对象序列化为json。 Should give us the following json: 应该给我们以下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. 如果你想在一个json中有很多Person,你可以将它们添加到列表中并序列化列表。 If you'd like an unique identifier for every distinct object you could, among other things, add an Id property to Person. 如果您希望每个不同对象都有唯一的标识符,您可以在其中添加Id属性给Person。 Like this: 像这样:

First add the Id propery to the Person class: 首先将Id属性添加到Person类:

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: 这应该给你Json这样:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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