• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

[JAVA!]Minecraft Chat JSON zu String

mastercake10

Minecrafter
Registriert
3 Januar 2013
Beiträge
14
Diamanten
0
Hallo,
Habe gerade ein problem. Ich möchte gerne die JSON vom Minecraft Chat zu einem String umwandeln und alle unnötigen
Charakter entfernen(like / ; { ; } ; :) so dass die Nachricht lesbar ist.

Ein Beispiel einer JSON - Chat nachricht auf einem Server:
{"text":"[{\"text\":\"\"},{\"text\":\"[G] \",\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gray\"},{\"text\":\"\",\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"white\"},{\"text\":\"[Helfer] \",\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gold\"},{\"text\":\"SarazarLP\",\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"red\"},{\"text\":\"?\",\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gold\"},{\"text\":\": vlt ich gebs ma weiter an die höheren teamler\",\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gray\"}]"}

Und diese will ich entwa so haben:

[G] SarzarLP: vlt ich gebs ma weiter an die höheren teamler

Weiß einer, wie ich dies erziele?
 

Taces

Minecrafter
Registriert
17 Oktober 2013
Beiträge
16
Diamanten
0
Das müsstest du gar nicht ^^
Du könntest deinen String z.B. bei jedem
text\":\"
splitten, dann hast du en String Array mit deinem Text und noch einigen Format-Angaben, du weißt aber schon einmal, dass er erste Teil jedes Array-Elements das ist, was du suchst. Ebenfalls weißt du, dass dieser Text mit einem \" aufhört. Also splittest du jedes Array-Element noch einmal bei \" und der erste Teil davon ist dann dein gesuchter Text ;) Das ganze Dann zusammensetzen und schon hast du es :)

/e
So könnte das ganze aussehen:

Code:
public String parseJSON(String json){
		String result="";
		for(String s1:json.split("text\\\":\\\"")){
			result+=s1.split("\\\"")[0];
		}
		return result;
	}

Dreifaches \ deswegen, weil du mit dem ersten \ das zweite \ escapest und mit dem dritten \ das ". Ist eine Sache von RegEx und ab und an ein wenig komplex ^^
 
Zuletzt bearbeitet:

mastercake10

Minecrafter
Registriert
3 Januar 2013
Beiträge
14
Diamanten
0
Das müsstest du gar nicht ^^
Du könntest deinen String z.B. bei jedem
text\":\"
splitten, dann hast du en String Array mit deinem Text und noch einigen Format-Angaben, du weißt aber schon einmal, dass er erste Teil jedes Array-Elements das ist, was du suchst. Ebenfalls weißt du, dass dieser Text mit einem \" aufhört. Also splittest du jedes Array-Element noch einmal bei \" und der erste Teil davon ist dann dein gesuchter Text ;) Das ganze Dann zusammensetzen und schon hast du es :)

/e
So könnte das ganze aussehen:

Code:
public String parseJSON(String json){
		String result="";
		for(String s1:json.split("text\\\":\\\"")){
			result+=s1.split("\\\"")[0];
		}
		return result;
	}

Dreifaches \ deswegen, weil du mit dem ersten \ das zweite \ escapest und mit dem dritten \ das ". Ist eine Sache von RegEx und ab und an ein wenig komplex ^^

Wie wärs einfach das JSON mit nem normalen JSON Parser zu parsen und alle "text" Elemente aneinander zufügen? Das sollte wunderbar mit simple-json laufen.


Danke für die vorschläge. Ich habe den text bei jeden Komma gesplittet und hier das Schema:

{"text":"[G] "
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gray"}
{"text":""
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"white"}
{"text":"[Premium] "
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"dark_green"}
{"text":"Username1023"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"aqua"}
{"text":"?"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gold"}
{"text":": bin off bb:D"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gray"}]
[{"text":""}

Dann habe ich es so ähnlich wie Taces gemacht und versucht den Text rauszufiltern:

String[] msgsplittet = msg.split(",");
for(int i = 0; i < msgsplittet.length; i++){
String result="";
for(String s1:msgsplittet.split("\\{\"text\":\"")){
result+=s1.split("\"")[0];

}
System.out.println(result);
}


Bei der ersten nachricht Funktioniert es, ich bekomme sie auch fast wie in Minecraft (Abgesehn von ein paar eckigen klammern)
Aber bei der zweiten bekomme ich einen Error...
Hier die nachrichten in Json's:
[{"text":""}
{"text":"You are globally warned on glizer "
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gold"}
{"text":"(-10)"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"yellow"}]
[{"text":""}
{"text":"[G] "
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gray"}
{"text":""
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"white"}
{"text":"[Premium] "
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"dark_green"}
{"text":"Username1023"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"aqua"}
{"text":"?"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gold"}
{"text":": bin off bb:D"
"bold":false
"italic":false
"underlined":false
"strikethrough":false
"obfuscated":false
"color":"gray"}]
[{"text":""}

Disconnected: Internal exception: io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBound***ception: readerIndex(1) + length(4) exceeds writerIndex(4): UnpooledHeapByteBuf(ridx: 1, widx: 4, cap: 4)
io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBound***ception: readerIndex(1) + length(4) exceeds writerIndex(4): UnpooledHeapByteBuf(ridx: 1, widx: 4, cap: 4)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:258)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:140)
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:154)
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:154)
at io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:148)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:317)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:794)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IndexOutOfBound***ception: readerIndex(1) + length(4) exceeds writerIndex(4): UnpooledHeapByteBuf(ridx: 1, widx: 4, cap: 4)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1161)
at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:612)
at ch.spacebase.packetlib.tcp.io.ByteBufNetInput.readInt(ByteBufNetInput.java:52)
at ch.spacebase.mc.protocol.packet.ingame.server.entity.ServerAnimationPacket.read(ServerAnimationPacket.java:32)
at ch.spacebase.packetlib.tcp.TcpPacketCodec.decode(TcpPacketCodec.java:36)
at io.netty.handler.codec.ByteToMessageCodec$1.decode(ByteToMessageCodec.java:42)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:227)
... 26 more

Habt ihr eine Lösung?
 

Taces

Minecrafter
Registriert
17 Oktober 2013
Beiträge
16
Diamanten
0
Bei welchem der beiden geht es denn und bei welchem nicht?
Laut der Fehlermeldung hast du ja eine IndexOutOfBound***ception, allerdings lässt sich ohne den Code und entsprechende Zeilenangaben nicht nachvollziehen, woher er genau kommt.
 
Oben