You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#/Java筛选JSON中displayValue为Outfit的数据并生成图片

实现方案

C# 版本

1. JSON解析与筛选

针对5万行的大JSON文件,推荐使用.NET Core/5+自带的System.Text.Json,它的流式处理能力更适合大文件,能避免内存溢出问题。

  • 先定义匹配JSON结构的数据模型:
public class OutfitItem
{
    public TypeInfo Type { get; set; }
    public string Name { get; set; }
    public ImageInfo Images { get; set; }
    public string Rarity { get; set; }
}

public class TypeInfo
{
    public string DisplayValue { get; set; }
}

public class ImageInfo
{
    public string SmallIcon { get; set; }
    public string Icon { get; set; }
    public string Featured { get; set; }
}

public class RootObject
{
    public List<OutfitItem> Data { get; set; }
}
  • 读取并筛选目标数据:
using (var stream = File.OpenRead("your-data.json"))
{
    var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
    var root = await JsonSerializer.DeserializeAsync<RootObject>(stream, options);
    var filteredOutfits = root.Data.Where(item => item.Type?.DisplayValue == "Outfit").ToList();
}

2. 生成带文本的图片

推荐跨平台的SkiaSharp库来处理图片,比System.Drawing.Common兼容性更好。

  • 先安装NuGet包:SkiaSharp、SkiaSharp.NativeAssets.Linux(非Windows平台需额外安装)
  • 图片生成代码:
using SkiaSharp;

foreach (var outfit in filteredOutfits)
{
    // 加载featured图作为背景
    using var bitmap = SKBitmap.Decode(outfit.Images.Featured);
    using var canvas = new SKCanvas(bitmap);
    
    // 配置文本样式
    var textPaint = new SKPaint
    {
        Color = SKColors.White,
        TextSize = 48,
        IsAntialias = true,
        StrokeWidth = 2,
        Typeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Bold)
    };
    
    // 绘制名称(左上角)
    canvas.DrawText(outfit.Name, 20, 60, textPaint);
    
    // 绘制稀有度(右下角)
    var rarityWidth = textPaint.MeasureText(outfit.Rarity);
    canvas.DrawText(outfit.Rarity, bitmap.Width - rarityWidth - 20, bitmap.Height - 40, textPaint);
    
    // 保存图片
    using var image = SKImage.FromBitmap(bitmap);
    using var data = image.Encode(SKEncodedImageFormat.Png, 100);
    using var stream = File.OpenWrite($"{outfit.Name}.png");
    data.SaveTo(stream);
}

Java 版本

1. JSON解析与筛选

使用Jackson的流式API处理大JSON,避免一次性加载整个文件到内存。

  • 定义数据模型:
public class OutfitItem {
    private TypeInfo type;
    private String name;
    private ImageInfo images;
    private String rarity;
    
    // Getters and Setters
}

public class TypeInfo {
    private String displayValue;
    
    // Getter and Setter
}

public class ImageInfo {
    private String smallIcon;
    private String icon;
    private String featured;
    
    // Getters and Setters
}
  • 读取并筛选数据:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(new File("your-data.json"));
JsonNode dataNode = rootNode.get("data");

List<OutfitItem> filteredOutfits = new ArrayList<>();
for (JsonNode itemNode : dataNode) {
    String typeDisplay = itemNode.get("type").get("displayValue").asText();
    if ("Outfit".equals(typeDisplay)) {
        OutfitItem outfit = mapper.treeToValue(itemNode, OutfitItem.class);
        filteredOutfits.add(outfit);
    }
}

2. 生成带文本的图片

使用Java原生的Java2D API处理图片,无需额外依赖。

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

for (OutfitItem outfit : filteredOutfits) {
    // 加载背景图
    BufferedImage background = ImageIO.read(new File(outfit.getImages().getFeatured()));
    Graphics2D g2d = background.createGraphics();
    
    // 配置文本样式
    g2d.setColor(Color.WHITE);
    g2d.setFont(new Font("Arial", Font.BOLD, 48));
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    
    // 绘制名称
    g2d.drawString(outfit.getName(), 20, 60);
    
    // 绘制稀有度(右下角)
    FontMetrics metrics = g2d.getFontMetrics();
    int x = background.getWidth() - metrics.stringWidth(outfit.getRarity()) - 20;
    int y = background.getHeight() - 40;
    g2d.drawString(outfit.getRarity(), x, y);
    
    g2d.dispose();
    
    // 保存图片
    ImageIO.write(background, "PNG", new File(outfit.getName() + ".png"));
}

内容的提问来源于stack exchange,提问作者hello.w.o.r.l.d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:35:28