Data——Json

1.JsonUtility

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public class Person
{
    public string name;
    public int age;
}
[Serializable]
public class Persons
{
    public Person[] persons;
}
public class JsonUtilityDemo : MonoBehaviour
{
    void Start()
    {
        //创建,解析
        //两种方法:
        //LitJson 和 JsonUtility

        //创建
        Person person1 = new Person();
        person1.name = "李逍遥";
        person1.age = 18;
        //转成json字符串
        string jsonStr1 = JsonUtility.ToJson(person1);

        Person person2 = new Person();
        person2.name = "王小虎";
        person2.age = 8;

        Persons persons = new Persons();
        persons.persons = new Person[] { person1, person2 };
        string jspnStr2 = JsonUtility.ToJson(persons);
        Debug.Log(jspnStr2);
        //{"persons":[{"name":"李逍遥","age":18},{"name":"王小虎","age":8}]}

        //解析
        Persons ps = JsonUtility.FromJson<Persons>(jspnStr2);
        foreach (Person p in ps.persons)
        {
            Debug.Log(p.name);
            Debug.Log(p.age);
        }
    }
}

2.LitJson

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

public class Hero
{
    public string name;
    public int age;
}
public class Heros
{
    public Hero[] heroes;
}

public class LitJsonDemo : MonoBehaviour
{
    void Start()
    {
        //Func1();
        //Func2();
        Func3();
    }

    //第一种创建和解析的方法
    void Func1()
    {
        Hero hero1 = new Hero();
        hero1.name = "超人";
        hero1.age = 40;
        Hero hero2 = new Hero();
        hero2.name = "蝙蝠侠";
        hero2.age = 45;

        Heros heros = new Heros();
        heros.heroes = new Hero[] { hero1, hero2 };

        //创建json
        string jsonStr = JsonMapper.ToJson(heros);
        Debug.Log(jsonStr);
        //{"heroes":[{"name":"\u8D85\u4EBA","age":40},{"name":"\u8759\u8760\u4FA0","age":45}]}

        //解析json
        Heros hs = JsonMapper.ToObject<Heros>(jsonStr);
        for (int i = 0; i < hs.heroes.Length; i++)
        {
            Debug.Log(hs.heroes[i].name);
            Debug.Log(hs.heroes[i].age);
        }
    }

    //第二种创建json的方法
    void Func2()
    {
        /*JsonData jd = new JsonData();//代表js里面的一个类或者一个数组
        //jd.SetJsonType(JsonType.Array);//说明他是一个js数组 可以不写
        jd["name"] = "超人";
        jd["power"] = 90;
        Debug.Log(jd.ToJson());
        //{"name":"\u8D85\u4EBA","power":90}*/

        JsonData herosJD = new JsonData();
        JsonData hero1JD = new JsonData();
        hero1JD["name"] = "超人";
        hero1JD["power"] = 90;
        JsonData hero2JD = new JsonData();
        hero2JD["name"] = "蝙蝠侠";
        hero2JD["power"] = 80;

        JsonData heros = new JsonData();
        heros.Add(hero1JD);
        heros.Add(hero2JD);

        herosJD["heros"] = heros;

        Debug.Log(herosJD.ToJson());
        //{"heros":[{"name":"\u8D85\u4EBA","power":90},{"name":"\u8759\u8760\u4FA0","power":80}]}
    }

    //第二种解析json的方法
    void Func3()
    {
        string jsonStr = "{'heros':[{'name':'超人','power':90},{'name':'蝙蝠侠','power':80}]}";
        JsonData herosJD = JsonMapper.ToObject(jsonStr);
        JsonData heros = herosJD["heros"];
        foreach (JsonData heroJD in heros)
        {
            Debug.Log(heroJD["name"].ToString());
            Debug.Log((int)heroJD["power"]);
        }
    }
}

### Labelme生成的JSON文件转换为PNG格式标注图的方法 Labelme生成的JSON文件可以通过多种方式转换为PNG格式的标注图像。以下是几种常见方法及其代码实现: #### 方法一:使用`labelme_json_to_dataset`命令行工具 Labelme自带的命令行工具可以直接将单个或多个JSON文件转换为包含标注信息的PNG图像。以下是一个批量处理的Python脚本示例[^2]: ```python import os import os.path as osp import shutil import cv2 def json2png(json_folder, png_save_folder): if osp.isdir(png_save_folder): shutil.rmtree(png_save_folder) os.makedirs(png_save_folder) json_files = os.listdir(json_folder) for json_file in json_files: json_path = osp.join(json_folder, json_file) os.system("labelme_json_to_dataset {}".format(json_path)) label_path = osp.join(json_folder, json_file.split(".")[0] + "_json/label.png") png_save_path = osp.join(png_save_folder, json_file.split(".")[0] + ".png") label_png = cv2.imread(label_path, 0) label_png[label_png > 0] = 255 cv2.imwrite(png_save_path, label_png) if __name__ == '__main__': json_dir = "path/to/json/folder" # JSON文件所在文件夹 label_dir = "path/to/save/png/folder" # 转换后的PNG文件保存路径 json2png(json_folder=json_dir, png_save_folder=label_dir) ``` 上述代码通过调用`labelme_json_to_dataset`命令,将每个JSON文件转换为一个临时文件夹中的`label.png`,然后将其复制到指定的目标文件夹中,并将非零像素值设置为255以生成黑白掩码图像。 #### 方法二:直接解析JSON文件并绘制多边形 如果需要自定义转换逻辑,可以手动解析JSON文件并使用PIL库绘制多边形。以下是一个示例代码[^4]: ```python import json from PIL import Image, ImageDraw import os # 定义文件夹路径 folder_path = 'path/to/json/folder' # 遍历文件夹中的所有文件 for filename in os.listdir(folder_path): if filename.endswith('.json'): # 确保是JSON文件 file_path = os.path.join(folder_path, filename) # 读取JSON文件 with open(file_path, 'r') as f: data = json.load(f) # 获取图像的宽度和高度 image_width = data['imageWidth'] image_height = data['imageHeight'] # 创建一个新图片,假设图片大小是imageWidth x imageHeight,背景为黑色 image = Image.new('RGB', (image_width, image_height), 'black') draw = ImageDraw.Draw(image) # 遍历shapes,找到label为特定类别的多边形 for shape in data['shapes']: if shape['label'] == 'target_class': # 替换为目标类别名称 points = shape['points'] polygons = [(int(x[0]), int(x[1])) for x in points] draw.polygon(polygons, fill='white') # 保存图片 png_filename = os.path.splitext(filename)[0] + '.png' image.save(os.path.join(folder_path, png_filename)) ``` 此方法允许用户根据具体需求调整标签类别和绘制逻辑。 #### 方法三:修改Labelme源码以支持特殊编码的JSON文件 在某些情况下,JSON文件可能包含特殊字符编码(如`gb18030`)。此时可以通过修改Labelme的源码来兼容这些文件[^3]。具体步骤如下: 1. 查找Labelme安装路径(例如`D:\program\conda_1\envs\py39_torch\Lib\site-packages\labelme\cli`)。 2. 修改`json_to_dataset.py`文件中的第39行,将`data = json.load(open(json_file))`替换为`data = json.load(open(json_file, encoding='gb18030', errors='ignore'))`。 3. 使用以下代码批量转换JSON文件: ```python import os import glob if __name__ == '__main__': path = './path/to/json/files' # JSON文件所在文件夹路径 for json in os.listdir(path): if json.endswith('.json'): json_file = glob.glob(os.path.join(path, json)) for filename in json_file: os.system("labelme_json_to_dataset.exe %s" % (filename)) print(f"{filename} done") ``` #### 注意事项 - 在运行上述代码之前,请确保已正确安装Labelme及相关依赖项[^1]。 - 如果JSON文件数量较多,建议使用批处理脚本以提高效率。 - 根据实际需求调整代码中的类别名称(如`'wood'`或`'target_class'`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值