【问题标题】:JSON Simple unexpected character?JSON 简单的意外字符?
【发布时间】:2020-11-02 22:50:36
【问题描述】:
Unexpected character () at position 0.
    at org.json.simple.parser.Yylex.yylex(Yylex.java:610)
    at org.json.simple.parser.JSONParser.nextToken(JSONParser.java:269)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:118)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:81)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:75)
    at net.ddns.coolpvp.Testing.main(Testing.java:22)

我在 Java 上创建了一个 TCP 服务器,它正在接收一个 json 并给出了这个错误,但我检查了第一个字符是 '{',我该如何解决这个问题?我没有任何线索。如果您能帮助我,我将不胜感激
编辑:JSON 由 .NET Framework 在 C# 应用程序中生成,这是一个 JSON

{"Type":"level-info","LevelNumber":1}

这就是 C# 应用程序生成 JSON 的方式
程序.cs

using System;
using System.Text;
using System.Net.Sockets;
using System.IO;

namespace Testing
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            client.Connect("localhost", 152);
            StreamWriter writer = new StreamWriter(client.GetStream(), Encoding.UTF8) { AutoFlush = true };
            writer.WriteLine(new RequestLevelInfo(1).ToJSONString());
            client.Close();
            Console.ReadKey(true);
        }
    }
}

RequestLevelInfo.cs

using System.Web.Script.Serialization;

namespace Testing
{
    public class RequestLevelInfo
    {
        public string Type { get { return "level-info"; } }
        public int LevelNumber { get; }
        public RequestLevelInfo(int level)
        {
            LevelNumber = level;
        }
        public string ToJSONString()
        {
            return new JavaScriptSerializer().Serialize(this);
        }
    }
}

服务器正在使用 BufferedReader 使用 readLine 方法读取它

package testing;

import java.net.Socket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Testing {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket();
            server.bind(new InetSocketAddress(InetAddress.getByName("localhost"), 152));
            Socket client = server.accept();
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
            String dataReceived = reader.readLine();
            JSONObject json = (JSONObject)new JSONParser().parse(dataReceived);
            System.out.println(json.toJSONString());
            client.close();
            server.close();
        } catch (IOException ex) {
            ex.printStackTrace(System.err);
        } catch (ParseException ex) {
            ex.printStackTrace(System.err);
        }
    }
}

【问题讨论】:

  • 你可以在你的问题中包含你的 JSON 吗?
  • JSON内容是如何生成并发送到服务器的?服务器如何读取它?请在问题中包含代码
  • 请同时显示您的 JSON 文件,以便我们查看错误是否是由于 JSON 文件造成的。
  • 你是否使用了类似 .writeUTF(String) 的东西,因为这个方法在开头添加了两个字节作为长度,比如 [0x00][0x01][a]?
  • 据我所知,错误不是由 JSON 文件引起的,您能否向我们展示一下您读取 JSON 文件时使用的代码?

标签: java c# json


【解决方案1】:

问题出在您的 C# 代码中:它发送的 JSON 不正确。

您正在使用Encoding.UTF8 对象。此对象包含一个不可见且不必要的“字节顺序标记”字符,Java JSON 解析器无法理解该字符。 JSON“不得”使用字节顺序标记字符:JSON Specification and usage of BOM/charset-encoding

解决方案是创建您自己的UTF8Encoding 实例。例如:

UTF8Encoding jsonEncoding = new UTF8Encoding(false);
StreamWriter writer = new StreamWriter(client.GetStream(), jsonEncoding) { AutoFlush = true };

【讨论】:

    【解决方案2】:

    您好,我考虑了您的代码并更改了一些内容,这是我的代码:

    public static void main(String[] args) {
    
        try {
            BufferedReader bufferedReader = java.nio.file.Files.newBufferedReader(Paths.get("test.json"));
            JSONObject data = (JSONObject) new JSONParser().parse(bufferedReader);
            System.out.println(data.get("Type"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    这是 test.json 文件的内容: {"Type":"level-info","LevelNumber":1}

    我的输出是:level-info

    请检查您是否真的导入了org.json.simple.JSONObjectorg.json.simple.parser.JSONParserorg.json.simple.parser.ParseException。 并不是说您不小心导入了其他任何东西。

    玩得开心,希望能帮到你!

    编辑

    所以,对我来说,以下示例发生了错误:

    public static void main(String[] args) {
    
        try {
            String string = "{name=Asel, number1=40.34, number2=29.343}";
            JSONObject object = (JSONObject) new JSONParser().parse(string);
            System.out.println(object.get("name"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    但不是这样:

    public static void main(String[] args) {
    
        try {
            String string = "{\"name\":\"Asel\", \"number1\":\"40.34\", \"number2\":\"29.343\"}";
            JSONObject object = (JSONObject) new JSONParser().parse(string);
            System.out.println(object.get("name"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    因此,我想知道您真正从 TCP 套接字获得的字符串是否完全是 {"Type":"level-info","LevelNumber":"1"} 并且没有问题,例如:{"Type"="level-info","LevelNumber"="1"}

    为了测试,您可以尝试将TPC Socket字符串中的=替换为:,看看是否仍然出现错误。

    JSONObject json = (JSONObject)new JSONParser().parse(dataReceived.replace("=", ":"));

    【讨论】:

    • 所以,这基本上就是我所做的,但我是从一个文件中读取的,我实际上是从一个 BufferedReader 读取的,它是从一个从 TCP 套接字读取的 InputStreamReader 读取的,所以我不能真的这样做
    • 好的,请稍等
    • 我编辑了我的答案,但不幸的是我现在无法使用套接字连接对其进行测试,但我也可以从使用缓冲阅读器读取的文件中进行测试。
    • 我不认为从读者那里解析对我有好处,因为在这个服务器上我必须多读几次,你能看看我现在发布的整个代码,看看有没有有什么错误吗?还是我缺少的东西?感谢您的关注
    • 是的,我可以等一下
    猜你喜欢
    • 2013-09-14
    • 2013-05-31
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2021-08-29
    • 2018-09-13
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多