【问题标题】:How to get a UTF-8 JSON如何获取 UTF-8 JSON
【发布时间】:2015-10-13 12:30:44
【问题描述】:

我正在使用 LitJSON 库,但事情有点奇怪。

你知道在转换时保留重音的任何 JSON 库吗?

这是测试:

test.json

[{"id":"CS_001","name":"L'élément","type":"Tôt"},{"id":"CS_002","name":"L'outrage","type":"Tôt"},{"id":"CS_003","name":"Test","type":"Tôt"}]

test.cs

public class test : MonoBehaviour {
    private string jsonString;
    private JsonData cardData;
    JsonData database;

    void Start () {
        jsonString = File.ReadAllText (Application.dataPath + "/test.json");
        cardData = JsonMapper.ToObject (jsonString);
        database = JsonMapper.ToJson (cardData);
        Debug.Log (database.ToString ());
    }
}

Debug.Log 变成:

[{"id":"CS_001","name":"L'\u00E9l\u00E9ment","type":"T\u00F4t"},{"id":"CS_002","name":"L'outrage","type":"T\u00F4t"},{"id":"CS_003","name":"Test","type":"T\u00F4t"}]

知道如何获得正确的 Json 吗?即使它与另一个 JSON 库一起使用。

非常感谢。

【问题讨论】:

标签: c# json litjson


【解决方案1】:

内容类型:application/json; charset=utf-8 指定内容为 JSON 格式,以 UTF-8 字符编码进行编码。 JSON 的默认编码是 UTF-8。在这种情况下,接收服务器显然不知道它正在处理 UTF-8 编码的 JSON,您可能需要手动转换它:

byte[] encodedBytes = Encoding.UTF8.GetBytes(jsonString);
Encoding.Convert(Encoding.UTF8, Encoding.Unicode, encodedBytes);

或者只是尝试在您的请求中指定内容类型:

content-type: application/json; charset=utf-8

【讨论】:

  • 嗨,谢谢你的回答,我试过 byte[] 但这不起作用。我正在使用 mono/unity,但没有找到指定内容类型的位置,谢谢
  • 这里只是一个评论,如果您从流中获取 json 字符串并使用流阅读器来“ReadToEnd”,那么 .net 将默认读取为 Unicode 而不是 UTF8 数据所在,这通常会导致一个可能很难弄清楚的灾难性和无声的错误。要解决此问题,可以在StreamReader 构造函数上设置编码参数,或者将流读入byte[] 并使用Encoding.UTF8.GetString 解码
【解决方案2】:

这是一个使用Json.Net 反序列化字符串的示例:

using System;
using Newtonsoft.Json;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        // Deserialize the JSON into a list of CardData
        var ob = JsonConvert.DeserializeObject<List<CardData>>("[{\"id\":\"CS_001\",\"name\":\"L'élément\",\"type\":\"Tôt\"},{\"id\":\"CS_002\",\"name\":\"L'outrage\",\"type\":\"Tôt\"},{\"id\":\"CS_003\",\"name\":\"Test\",\"type\":\"Tôt\"}]" );

        /*
          The output will be:
            id: CS_001, name: L'élément, type: Tôt
            id: CS_002, name: L'outrage, type: Tôt
            id: CS_003, name: Test, type: Tôt
        */
        foreach(var i in ob){
            Console.WriteLine(i);  
        }
    }
}

// Class that will hold the deserialized data
// For demo puposes
public class CardData
{
    public string id { get; set; }
    public string name { get; set; }
    public string type { get; set; }

    public override string ToString(){
        return String.Format("id: {0}, name: {1}, type: {2}",id, name, type);   
    }
}

Live demo available here

【讨论】:

    【解决方案3】:

    您可能使用错误的编码读取文本文件。尝试将 overload 用于 File.ReadAllText,它接受 Encoding 参数并将其传递为 UTF8。

    【讨论】:

    • 嗨,谢谢你的回答,我试过了: File.WriteAllText (Application.dataPath + "/database.json", database.ToString(), Encoding.UTF8);但它保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2014-04-07
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多