首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LitJson编辑存储在一个json文件中的一个类的多个实例的单个属性?

如何使用LitJson编辑存储在一个json文件中的一个类的多个实例的单个属性?
EN

Stack Overflow用户
提问于 2017-02-10 18:47:07
回答 2查看 1K关注 0票数 0

我正在尝试使用json文件创建一个库存系统。基本上,我有我的json文件:

代码语言:javascript
复制
[
    {
    "name":"Potion",
    "id":1,
    "balance":5
    },
    {
    "name":"Neutral Bomb",
    "id":2,
    "balance": 4
    }
]

我有我的c#文件:

代码语言:javascript
复制
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);
    }
}

在我的c#文件中,我想访问一个项目,比如中立炸弹项目。我怎么才能进去修改中立炸弹的平衡?我想使用Item ID来判断要编辑哪个对象。我想要创建一个列表,其中每个元素都是存储在Json文件中的项目之一,但我不知道如何将它们分开。我该怎么办?

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-10 21:52:56

首先,Json中的变量名与Item类中的变量名不匹配。Item类中的类是大写的。

使用联合的JsonUtility

其次,从JsonHelper post中获取this类。它允许联合的JsonUtility序列化和反序列化Json。

,而不是,将来会手工生成Json,因为您会遇到这样的问题。使用Json类和一个简单的函数来完成这个任务。例如,这是:

代码语言:javascript
复制
void generateJson()
{
    Item[] item = new Item[2];

    item[0] = new Item();
    item[0].Name = "Potion";
    item[0].Id = 1;
    item[0].Balance = 5;

    item[1] = new Item();
    item[1].Name = "Neutral Bomb";
    item[1].Id = 2;
    item[1].Balance = 4;

    string value = JsonHelper.ToJson(item, true);
    Debug.Log(value);
}

将产生这样的结果:

代码语言:javascript
复制
{
    "Items": [
        {
            "Name": "Potion",
            "Id": 1,
            "Balance": 5
        },
        {
            "Name": "Neutral Bomb",
            "Id": 2,
            "Balance": 4
        }
    ]
}

没有错误。这是有效的json。

溶液

InventoryAttempt类:

代码语言:javascript
复制
public class InventoryAttempt
{
    public static void BalanceChange(string filePath, int ID, int change)
    {
        //Load Data
        string jsonString = File.ReadAllText(Application.dataPath + filePath);

        Item[] item = JsonHelper.FromJson<Item>(jsonString);

        //Loop through the Json Data Array
        for (int i = 0; i < item.Length; i++)
        {
            //Check if Id matches
            if (item[i].Id == ID)
            {
                Debug.Log("Found!");
                //Increment Change value?
                item[i].Balance += change;
                break; //Exit loop
            }
        }

        //Convert to Json
        string newJsonString = JsonHelper.ToJson(item);

        //Save
        File.WriteAllText(Application.dataPath + filePath, newJsonString);
    }
}

你的ItemItem

代码语言:javascript
复制
[Serializable]
public class Item
{
    public string Name;
    public int Id;
    public int Balance;

    public Item()
    {

    }

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

测试脚本:

代码语言:javascript
复制
public class Test : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        InventoryAttempt.BalanceChange("/Scripts/inventory.json", 1, 1);
    }
}

注意:

我删除了get/set属性的东西。请移除这些,因为它们必须被移除,这样才能工作。另外,[Serializable]被添加到Item类的顶部。请加上-好吧。我建议你在做问题下的“它不起作用”的评论之前,直接复制和替换这些类。

票数 1
EN

Stack Overflow用户

发布于 2017-02-10 19:02:19

首先,您的json似乎不是一个有效的数组(不是缺少的[] )。

代码语言:javascript
复制
[
    {
        "name":"Potion"
        "id":1,
        "balance":7
    },
    {
        "name":"Neutral Bomb",
        "id":2,
        "balance": 4
    }
]

此外,我将遵循命名约定,并使用大写字符启动属性。

代码语言:javascript
复制
public class Item
{
    public string Name  { get; set; }
    public int Id       { get; set; }
    public int Balance  { get; set; }

    public Item()
    {
    }

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

下面的代码应该给您想要的,但取决于您的项目范围可能是非常低效的。您可能需要考虑缓存jsonString和/或反序列化结果。您还可能希望使用FirstOrDefault,如果它的预期ID可能不存在,则使用null检查。

代码语言:javascript
复制
public class InventoryAttempt : MonoBehaviour
{
    public static Item JsonToItem(string filePath, int itemID)
    {
        string jsonString = File.ReadAllText(Application.dataPath + filePath);
        return JsonMapper.ToObject<List<Item>>(jsonString).First(x => x.Id == itemID);
    }

    void Start()
    {
        var item = JsonToItem("/Scripts/inventory.json", 1);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42166577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档